您的位置:首页 > 其它

本原串(map加快速幂)

2015-07-04 16:16 148 查看


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

#include <cstdio>
#include<iostream>
#include<cmath>
#include<map>
#define ll long long
using 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
!=0)
    {
        return mp
;
    }
    //通过上面判断mp
是否为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
=sum;
    return sum;
}
int main()
{
   ll n;
   mp[1]=mp[2]=2;
   while(cin>>n)
   {
       cout<<cal(n)<<endl;
   }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: