一开始想用等比数列公式搞,但是模数可能为合数。。然后裸上矩乘,注意要用快速乘要不然会爆long long。
#include<cstdio>
#include<iostream>
#include<cmath>
#include<memory.h>
#define ll long long
using namespace std;
ll m,a,c,x0,n,g,an;
struct ju{
ll a[2][2];
int n,m;
}ans,t;
ll mul(ll a,ll b)
{
if (b>a) swap(a,b);
if (b==0) return 0ll;
ll c=mul(a,b/2);
c=(c+c)%m;
if (b%2==1) c=(c+a)%m;
return c;
}
ju operator*(ju a,ju b)
{
ju ans;
memset(ans.a,0,sizeof(ans.a));
ans.n=a.n;ans.m=b.m;
for (int i=0;i<a.n;i++)
for (int j=0;j<b.n;j++)
for (int k=0;k<b.m;k++)
ans.a[i][k]=(ans.a[i][k]+mul(a.a[i][j],b.a[j][k]))%m;
return ans;
}
ju pow(ju a,ll b)
{
if (b==1) return a;
ju c=pow(a,b/2);
c=c*c;
if (b%2==1) c=c*a;
return c;
}
int main()
{
scanf("%lld%lld%lld%lld%lld%lld",&m,&a,&c,&x0,&n,&g);
t.a[0][0]=1ll;t.a[0][1]=0ll;t.a[1][0]=1ll;t.a[1][1]=a;t.n=2;t.m=2;
ans.a[0][0]=c;ans.a[1][0]=x0;ans.n=2;ans.m=1;
ans=pow(t,n)*ans;
cout<<ans.a[1][0]%g;
}
本文介绍了如何利用快速乘法和矩阵乘法解决等比数列求解问题,避免了直接使用等比数列公式可能导致的模数为合数情况下的复杂性。通过快速乘法优化计算过程,确保了求解效率,并在代码实现中详细展示了关键步骤。
558

被折叠的 条评论
为什么被折叠?



