zoukankan      html  css  js  c++  java
  • HDU2197 本原串

    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
  • 相关阅读:
    Android 操作系统架构开篇
    《构建之法》读后感
    《梦断代码》读后感
    学习日报
    学习日报
    记账本开发4
    记账本开发3
    学习日报
    学习日报
    记账本开发2
  • 原文地址:https://www.cnblogs.com/bxd123/p/11381412.html
Copyright © 2011-2022 走看看