码迷,mamicode.com
首页 > 其他好文 > 详细

HDU2197 本原串

时间:2019-08-20 10:26:29      阅读:60      评论:0      收藏:0      [点我收藏+]

标签:def   一个   递归   err   tput   problem   个数   output   div   

Problem Description
由0和1组成的串中,不能表示为由几个相同的较小的串连接成的串,称为本原串,有多少个长为n(n<=100000000)的本原串?
答案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;
    }
}
View Code

 

HDU2197 本原串

标签:def   一个   递归   err   tput   problem   个数   output   div   

原文地址:https://www.cnblogs.com/bxd123/p/11381412.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!