D - 本原串
#include<iostream>
#include<cstdio>
using namespace std;
int a[100000005];
long long mod_pow(long long m,long long n,int mod) //快速幂取模
{
long long ans=1;
while(n)
{
if(n%2)
ans=ans*m%mod;
m=m*m%mod;
n/=2;
}
return ans;
}
int solve(long long n)
{
if(a[n]!=0)
return a[n];
a[n]=mod_pow(2,n,2008)-2;
for(int i=2;i*i<=n;i++) //取因子
{
if(n%i==0)
{
a[n]=(a[n]-solve(i)+2008)%2008;
if(i*i!=n) //如果不是开方因子,就顺便把另一半求出来
a[n]=(a[n]-solve(n/i)+2008)%2008;
}
}
return a[n];
}
int main()
{
a[0]=0,a[1]=2,a[2]=2;
int n;
while(scanf("%d",&n)!=EOF)
{
if(n>2)
a[n]=solve(n);
printf("%d\n",a[n]);
}
return 0;
}