D题题解

D - 本原串

 
src="https://vjudge.net/problem/description/19316?1514797577000" width="100%" height="765px" frameborder="0" scrolling="no" style="box-sizing: inherit;">

#include<iostream>

#include<cstdio>

using namespace std;

int a[100000005];

long long mod_pow(long long m,long long n,int mod)    //快速幂取模

{

    long long ans=1;

    while(n)

    {

        if(n%2)

          ans=ans*m%mod;

        m=m*m%mod;

        n/=2;

    }

    return ans;

}

 

int solve(long long n)

{

    if(a[n]!=0)

      return a[n];

    a[n]=mod_pow(2,n,2008)-2;

    for(int i=2;i*i<=n;i++)     //取因子

    {

        if(n%i==0)

        {

            a[n]=(a[n]-solve(i)+2008)%2008;

            if(i*i!=n)       //如果不是开方因子,就顺便把另一半求出来

              a[n]=(a[n]-solve(n/i)+2008)%2008;

        }

    }

    return a[n];

}

 

int main()

{

    a[0]=0,a[1]=2,a[2]=2;

    int n;

    while(scanf("%d",&n)!=EOF)

    {

        if(n>2)

          a[n]=solve(n);

        printf("%d\n",a[n]);

    }

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值