hdu 2197 本原串

http://acm.hdu.edu.cn/showproblem.php?pid=2197

长度为n的01串有2的n次方个,再减去不符合要求的。不符合要求的字符串就是长度为n的约数的字符串。 递归处理,然后用map映射记录求出的每一个数的值,为以后再次输入处理过的数,就可以直接输出,不用递归处理。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <map>
 4 #define ll long long
 5 #include <algorithm>
 6 using namespace std;
 7 
 8 ll n;
 9 map<ll,ll>q;
10 
11 ll quickmod(ll a,ll b,ll m)
12 {
13     ll ans = 1;
14     ll c=a%m;
15     while(b)
16     {
17         if(b&1)
18         {
19             ans = (ans*c)%m;
20             b--;
21         }
22         b/=2;
23         c = c*c%m;
24     }
25     return ans;
26 }
27 
28 ll Get_num(int n)
29 {
30     if(q[n]!=0)
31     {
32         return q[n];
33     }
34     else
35     {
36         ll ans=quickmod(2,n,2008);
37         ans-=2;
38         ans%=2008;
39         for(int i=2; i*i<=n; i++)
40         {
41             if(n%i!=0) continue;
42             if(i*i==n)
43             {
44                 ans-=Get_num(i);
45                 ans%=2008;
46             }
47             else
48             {
49                 ans-=Get_num(i);
50                 ans-=Get_num(n/i);
51                 ans%=2008;
52             }
53         }
54         ans=(ans+2008)%2008;
55         q[n]=ans;
56         return ans;
57     }
58 }
59 int main()
60 {
61     q[1]=2;
62     while(scanf("%lld",&n)!=EOF)
63     {
64         printf("%lld\n",Get_num(n));
65     }
66     return 0;
67 }
View Code

 

posted @ 2014-10-20 19:23  null1019  阅读(110)  评论(0编辑  收藏  举报