HDU2197 本原串
Posted bxd123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU2197 本原串相关的知识,希望对你有一定的参考价值。
Problem Description
由0和1组成的串中,不能表示为由几个相同的较小的串连接成的串,称为本原串,有多少个长为n(n<=100000000)的本原串?
答案mod2008.
例如,100100不是本原串,因为他是由两个100组成,而1101是本原串。
答案mod2008.
例如,100100不是本原串,因为他是由两个100组成,而1101是本原串。
Input
输入包括多个数据,每个数据一行,包括一个整数n,代表串的长度。
Output
对于每个测试数据,输出一行,代表有多少个符合要求本原串,答案mod2008.
Sample Input
1
2
3
4
Sample Output
2
2
6
12
Author
scnu
递归
#include"bits/stdc++.h" using namespace std; #define rep(i,a,b) for(int i=(a);i<=(b);i++) #define repp(i,a,b) for(int i=(a);i>=(b);--i) #define ll long long #define see(x) (cerr<<(#x)<<‘=‘<<(x)<<endl) #define inf 0x3f3f3f3f #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// const int N=100000000+10 ; const int mod=2008; ll fast(ll x,ll n) ll ans=1; while(n) if(n&1)ans=ans*x%mod; x=x*x%mod; n>>=1; return ans; ll mp[N],n; ll cal(ll n) if(mp[n])return mp[n]; mp[n]=fast(2,n)-2; for(ll i=2;i*i<=n;i++) if(n%i==0) mp[n]=(mp[n]-cal(i)+mod)%mod; if(i*i!=n)mp[n]=(mp[n]-cal(n/i)+mod)%mod; return mp[n]; int main() mp[0]=0; mp[1]=2; mp[2]=2; while(cin>>n) cout<<cal(n)<<endl;
以上是关于HDU2197 本原串的主要内容,如果未能解决你的问题,请参考以下文章