Problem Description
答案mod2008.
例如,100100不是本原串,因为他是由两个100组成,而1101是本原串。
Input
Output
Sample Input
Sample Output
12
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
#include<map>
#include<queue>
#include<cmath>
#include<functional>
using namespace std;
const int maxn = 10005;
const int base=2008;
map<int,int> M;
int n;
int get(int x)
{
int i,j,k;
for (i=x,j=2,k=1;i;i>>=1)
{
if (i&1) (k*=j)%=base;
(j*=j)%=base;
}
return k;
}
int work(int x)
{
if (!M.count(x))
{
int ans=(get(x)-2)%base;
for (int i=2,k=sqrt(1.0*x);i<=k;i++)
if (x%i==0)
{
(ans-=work(i))%=base;
if (i*i<x) (ans-=work(x/i))%=base;
}
M[x]=(ans+base)%base;
}
return M[x];
}
int main()
{
M[1]=2;
while (~scanf("%d", &n)) cout<<work(n)<<endl;
return 0;
}