本原串(map加快速幂)

来源:互联网 发布:淘宝的选购热点 编辑:程序博客网 时间:2024/04/30 02:56


有一个问题就是不知道为什么要加入 sum=(sum+2008)%2008;


#include <cstdio>#include<iostream>#include<cmath>#include<map>#define ll long longusing namespace std;/*这一题其实不难,就是让你找字串我们知道全有0和1组成的长度为0的字符串有2^n种!所以在这里要减去他的字串,首先他的字串的长度必须是能被他整除所以这里就相当于找约数了!这里加入了递推!也加入了map,这里map用于记录已经找到的数的非字串的所有个数,所以如果这个数是要求的n的约数就可以直接求了!*/map<ll,ll>mp;ll pow_mod(ll a,ll n,ll m){    ll ans = 1;    a = a % m;    while(n>0)    {        if(n%2 ==1)            ans=(ans*a)%m;        n=n/2;        a=(a*a) % m;    }    return ans;}ll cal(ll n){    ll i,sum;    sum=pow_mod(2,n,2008)-2;//去掉本身的00000和111111    if(mp[n]!=0)    {        return mp[n];    }    //通过上面判断mp[n]是否为0,来快速计算1    else    {        if(n==1)        {            return 2;        }        for(i=2;i*i<=n;i++)        {            if(n%i==0)            {                sum-=cal(i);                if(n!=i*i)                {                    sum-=cal(n/i);                }            }        }    }    sum%=2008;    sum=(sum+2008)%2008;//这里不知道为什么要加入这个东西,不加就会wrong answer!    mp[n]=sum;    return sum;}int main(){   ll n;   mp[1]=mp[2]=2;   while(cin>>n)   {       cout<<cal(n)<<endl;   }}


0 0
原创粉丝点击