1 条题解
-
1
#include<bits/stdc++.h> #define mul(x,y) Wuguidechengfa(x,y) using namespace std; typedef long long ll; const int N=40; inline ll read() { char c;ll res=0; for(;!isdigit(c);c=getchar()); for(;isdigit(c);c=getchar())res=(res<<3)+(res<<1)+(c^48); return res; } ll mod,a,c,x0,n,g; ll Wuguidechengfa(ll x,ll y) { ll ans=0; while(y) { if(y&1) (ans+=x)%=mod; (x+=x)%=mod; y>>=1; } return ans; } //龟速乘 struct Mat { ll a[N][N]; //矩阵 int n,m; //行、列 Mat(){n=m=0;memset(a,0,sizeof a);} //构造空矩阵 Mat(int k){n=m=k;memset(a,0,sizeof a);for(int i=1;i<=k;i++)a[i][i]=1;} //构造k*k的单位矩阵 Mat(int x,int y){n=x,m=y;memset(a,0,sizeof a);} //构造x*y的空矩阵 Mat operator *(Mat b) { Mat c(n,b.m); for(int i=1;i<=c.n;i++) { for(int j=1;j<=c.m;j++) { for(int k=1;k<=m;k++) { c.a[i][j]=(c.a[i][j]+mul(a[i][k],b.a[k][j]))%mod; //注意这里用龟速乘而不是直接写乘号 } } } return c; } Mat operator *=(Mat b) { return *this=*this*b; } //重载乘法 Mat operator ^(ll k) { Mat ans(n),t=*this; while(k) { if(k&1) ans*=t; t*=t; k>>=1; } return ans; } Mat operator ^=(ll k) { return *this=*this^k; } //矩阵快速幂 }; int main() { mod=read();a=read();c=read();x0=read();n=read();g=read(); if(!n)return printf("%d\n",x0)&0; //特判n==0的情况 Mat res(4,4); res.a[1][1]=a,res.a[1][2]=1,res.a[2][2]=1; //构造转移矩阵 Mat p(2,1); p.a[1][1]=x0,p.a[2][1]=c; //构造初始矩阵 res^=n; res*=p; //注意乘法顺序,矩阵乘法不满足交换律 printf("%lld\n",res.a[1][1]%g); //注意答案对g取模 return 0; }
- 1
信息
- ID
- 176
- 时间
- 5000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者