社区讨论
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 条回复,欢迎继续交流。
正在加载回复...