社区讨论

WA掉两个点,求助

P4000斐波那契数列参与者 8已保存回复 14

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
14 条
当前快照
1 份
快照标识符
@mi7wfrbf
此快照首次捕获于
2025/11/21 04:43
4 个月前
此快照最后确认于
2025/11/21 06:33
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
long long n,p,l,lena,tot;
char a[30000010];
int f[300001],s[300001],x[300001];
long long gcd(long long a,long long b)
{
    if(b==0)
    {
        return a;
    }
    return gcd(b,a%b);
}
long long lcm(long long a,long long b)
{
    return a*b/gcd(a,b);
}
struct ju//矩阵 
{
    long long c1,c2,c3,c4;
};
ju k;
ju operator * (const ju &a,const ju &b)//矩阵重载乘号 
{
    ju c;
    c.c1=a.c1*b.c1+a.c2*b.c3;
    c.c2=a.c1*b.c2+a.c2*b.c4;
    c.c3=a.c3*b.c1+a.c4*b.c3;
    c.c4=a.c3*b.c2+a.c4*b.c4;
    return c;
}
void mo(ju &a)//矩阵取模 
{
    a.c1%=p;
    a.c2%=p;
    a.c3%=p;
    a.c4%=p;
}
ju ksm(ju a,long long b)//矩阵快速幂 
{
    ju anss;
    anss.c1=1;
    anss.c2=0;
    anss.c3=1;
    anss.c4=0;
    for(;b;b>>=1,a=a*a,mo(a))
    {
        if(b&1)
        anss=anss*a,mo(anss);
    }
    return anss;
}
long long ks(long long a,long long b)//快速幂 
{
    long long anss=1;
    for(;b;b>>=1,a=a*a)
    {
        if(b&1)
        anss=anss*a;
    }
    return anss;
}
long long read()//读入 
{
    long long x=0;
    for(int i=1;i<=lena;++i)
    {
        x=x*10+(a[i]-'0');
        x%=l;
    }
    return x;
}
long long work()//求最小循环节 
{
    long long kk=1;
    for(int i=1;i<=tot;++i)
    {
        kk=lcm(kk,x[i]);
    }
    return kk;
}
void fen(long long n)//质因数分解 
{
    for(int i=2;i*i<=n;++i)
    {
        if(n%i==0)
        {
            f[++tot]=i;
            while(n%i==0)
            {
                s[tot]++;
                n/=i;
            }
        }
    }
    if(n>1)
    {
        f[++tot]=n;
        s[tot]++;
    }
}
void doit()//
{
    for(int i=1;i<=tot;++i)
    {
        if(f[i]==2)x[i]=3;
        if(f[i]==3)x[i]=8;
        if(f[i]==5)x[i]=20;
        if(f[i]%5==1||f[i]%5==4)
        {
            x[i]=f[i]-1;
        }
        else
        {
            x[i]=f[i]*2+2;
        }
    }
    for(int i=1;i<=tot;++i)
    {
        x[i]=x[i]*ks(f[i],s[i]-1);
    }
}
int main()
{
    k.c1=1;
    k.c2=1;
    k.c3=1;
    k.c4=0;
    scanf("%s",a+1);
    lena=strlen(a+1);
    cin>>p;
    if(p==1)
    {
        cout<<"0";
        return 0;
    }
    fen(p);
    doit();
    l=work();
    n=read();
    if(n==0)
    {
        cout<<"0";
        return 0;
    }
    ju ans=ksm(k,n-1);
    cout<<ans.c1%p;
    return 0;
}

回复

14 条回复,欢迎继续交流。

正在加载回复...