zoj3707 Calculate Prime S


一个结论,F[i]是第i 个Fibonacci数,若i 是素数,则F[i]也是素数。。。至于为什么,我现在还不晓得。。。呵呵

还有,若a整除x,令m=k*x;则a%m也整除x;

所以这样,不用大数也能搞



#include<iostream>
#include<cstring>
#define mp 16000000
#define N 1300010
#define LL long long
using namespace std;

bool vis[mp]={1,1};
LL prime[N],k,x,m,M;

void initPrime()
{
    LL i,j,c=1;
    for(i=2;i*i<mp;i++) if(!vis[i])
    {
        prime[c++]=i;
        for(j=i*i;j<mp;j+=i) vis[j]=1;
    }
    for(;i<mp;i++) if(!vis[i]) prime[c++]=i;
}

struct jz
{
    LL a[2][2];
};

jz jzc(jz a,jz b)
{
    jz ans;
    ans.a[0][0]=(a.a[0][0]*b.a[0][0]%M+a.a[0][1]*b.a[1][0]%M)%M;
    ans.a[0][1]=(a.a[0][0]*b.a[0][1]%M+a.a[0][1]*b.a[1][1]%M)%M;
    ans.a[1][0]=(a.a[1][0]*b.a[0][0]%M+a.a[1][1]*b.a[1][0]%M)%M;
    ans.a[1][1]=(a.a[1][0]*b.a[0][1]%M+a.a[1][1]*b.a[1][1]%M)%M;
    return ans;
}

jz get_f(LL n)
{
    n--;
    jz ans,a;
    ans.a[0][0]=ans.a[1][1]=1;
    ans.a[0][1]=ans.a[1][0]=0;
    a.a[0][0]=a.a[0][1]=a.a[1][0]=1;
    a.a[1][1]=0;
    while(n)
    {
        if(n&1) ans=jzc(ans,a);
        a=jzc(a,a);
        n>>=1;
    }
    return ans;
}

int main()
{
    initPrime();
    //int i;M=10007;cout<<vis[M]<<endl;for(i=1;i<=30;i++) cout<<i<<" :"<<get_f(i).a[0][0]<<"-----"<<vis[get_f(i).a[0][0]]<<endl;
    int T;
    cin>>T;
    while(T--)
    {
        cin>>k>>x>>m;
        M=x*m;
        LL kx=prime[k];
        if(k==1) kx=3;
        if(k==2) kx=4;
        jz ks=get_f(kx);
        LL z1=ks.a[1][0],z2=ks.a[0][0];
        while(z2%x)
        {
            //cout<<"z2="<<z2<<endl;
            LL temp=z1;
            z1=z2;
            z2=(temp+z2)%M;
        }
        cout<<(z2/x)%m<<endl;
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值