備忘録

まとめておきたいことのメモ 主にプロコンのこと

AOJ-ICPC 1154

前に解いた問題をメモっておくのを忘れていた。

Monday-Saturday Prime Factors | Aizu Online Judge
まとめるとだいたいこんな感じの問題↓

  • 7で割った時のあまりが1または6の数字を「Monday-Saturday number」とよぶ
  • Monday-Saturday numberのうち、その数字と1以外のMonday-Satureday numberでは割り切れない数字のことを「Manday-Saturday Prime」とよぶ(例:27)
  • あるManday-Saturday numberであるbについて、あるManday-Saturday primeであるaで割り切れる時「aはbのMonday-Saturday prime factorである」という(例: 27は216のMonday-Saturday prime factor)

問題:入力されたMonday-Saturday numberのMonday-Saturday prime factorを求めよ。


こんな感じのコードを書いた。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <ctype.h>
#include <string> 
#include <sstream>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <map>
#include <queue>
#include <utility>
#include <vector>
#include <set>
  
using namespace std;
 
bool isprime(int n);
  
int main()
{
   int n;
   while(1){
    cin >> n;
    if(n == 1) break;
    cout << n << ':';
    for(int i = 0; i <= n / 7; i++){
        int divisor = 0;
        if(n % (7 * i + 1) == 0){
            divisor = 7 * i + 1;
            if(isprime(divisor)) cout << ' ' << divisor;
        } 
        if(n % (7 * i + 6) == 0){
            divisor = 7 * i + 6;
            if(isprime(divisor)) cout << ' ' << divisor;
        } 
    }
        cout << endl;
    }
    return 0;
}
 
bool isprime(int n)
{
    if(n == 1) return false;
    else if(n == 6) return true;
    else if(n % 6 == 0) return false;
    else {
        for(int i = 1; 7 * i <= n; i++){
            if(n == 7 * i + 1) break;
            else if(n == 7 * i + 6){
                if(n % (7 * i + 1) == 0) return false;
                else return true;
            } else if(n % (7 * i + 1) == 0 || n % (7 * i + 6) == 0) return false;
        }
    }
    return true;
}

最初は「7で割ると余りが1〜6のどれかになる数字」だと勘違いしていたためうまくいかなかった。
間違いに気づいてからは、Monday-Saturday primeであるかの判定に苦労した。
結局1のとき、6のとき、6の倍数の時、それ以外の時と分けているけどもっとうまいやり方がありそう。
7 * i + 1, 7 * i + 6としているところを7 * i - 1、7 * i + 1とすればもっとうまく処理できそう。