SRM 400 DIV1 Easy - StrongPrimePower

問題


http://community.topcoder.com/stat?c=problem_statement&pm=8763&rd=12172

ある整数nが与えられる。
このnが素数の階乗で表せるならその素数と階乗数を返す。
そのように表せられなければ空の文字列を返す。

解き方


nの最大は10^18で全探索できないが、
2乗の場合を除けば探索範囲はO(10^6)となり全探索可能。

2乗の場合の計算はdouble*double==longにならないよう、型を一致させることに注意。

コード


class StrongPrimePower {

public: vector<int> baseAndExponent(string n) {
vector<int> ans;
long long x;
stringstream out(n);
out>>x;

for(int i=2;i<=1000000 && i<x;i++)if(x%i==0){
long long tmp=x;
int cnt=0;
while(tmp%i==0){
tmp/=i;
cnt++;
}
if(tmp==1){
ans.push_back(i);
ans.push_back(cnt);
return ans;
}
return ans;
}

long long y=sqrt((double)x);
if(y*y==x){
ans.push_back(y);
ans.push_back(2);
}

return ans;
}

};
このエントリーをはてなブックマークに追加