首页 > 代码库 > hdu 2197 本原串
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 else35 {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 else48 {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 }
hdu 2197 本原串
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。