社区讨论
WA2,铅条
P1397[NOI2013] 矩阵游戏参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mdmjwyev
- 此快照首次捕获于
- 2025/07/28 11:31 7 个月前
- 此快照最后确认于
- 2025/07/28 11:43 7 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
char m1[1000010],n1[1000010];
long long a,b,c,d,l1,l2,n,m;
struct jz{
long long t[100][100];
}ans,A,B,C;
jz jzcf(jz x, jz y){
jz z;
for(int i=0;i<2;i++){
for(int j=0;j<2;j++){
z.t[i][j] = 0;
for(int k=0;k<2;k++){
z.t[i][j] = (z.t[i][j] + (x.t[i][k]*y.t[k][j])%mod)%mod;
}
}
}
return z;
}
jz ksm(jz u,int v){
jz w;
for(int q=0;q<2;q++){
for(int p=0;p<2;p++){
w.t[q][p]=0;
}
w.t[q][q]=1;
}
while(v!=0){
if(v%2==1) w=jzcf(w,u);
u=jzcf(u,u);
v=v/2;
}
return w;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n1>>m1>>a>>b>>c>>d;
A.t[0][0]=a,A.t[0][1]=b;
A.t[1][0]=0,A.t[1][1]=1;
B.t[0][0]=c,B.t[0][1]=d;
B.t[1][0]=0,B.t[1][1]=1;
l1=strlen(n1),l2=strlen(m1);
if(a!=1){
for(int i=0;i<l2;i++){
m=(m*10+m1[i]-'0')%(mod-1);
}
m=(m-1+mod-1)%(mod-1);
C=ksm(A,m);
ans=jzcf(B,C);
if(ans.t[0][0]==1){
for(int i=0;i<l1;i++){
n=(n*10+n1[i]-'0')%mod;
}
n=(n-1+mod)%mod;
ans.t[0][1]=(ans.t[0][1]*n);
ans=jzcf(C,ans);
cout<<(ans.t[0][0]+ans.t[0][1])%mod;
}
else{
for(int i=0;i<l1;i++){
n=(n*10+n1[i]-'0')%(mod-1);
}
n=(n-1+mod-1)%(mod-1);
ans=jzcf(C,ksm(ans,n));
cout<<(ans.t[0][0]+ans.t[0][1])%mod;
}
}
else{
for(int i=0;i<l2;i++){
m=(m*10+m1[i]-'0')%mod;
}
m=(m-1+mod)%(mod);
A.t[0][0] = 1;
A.t[0][1] = b*m;
A.t[1][0] = 0;
A.t[1][1] = 1;
C=jzcf(B,A);
if(C.t[0][0]==1){
for(int i=0;i<l1;i++){
n=(n*10+n1[i]-'0')%mod;
}
n=(n-1+mod)%mod;
C.t[0][1]=(C.t[0][1]*n);
C=jzcf(A,C);
cout<<(C.t[0][0]+C.t[0][1])%mod;
}
else{
for(int i=0;i<l1;i++){
n=(n*10+n1[i]-'0')%(mod-1);
}
n=(n-1+mod-1)%(mod-1);
ans=jzcf(A,ksm(C,n));
cout<<(ans.t[0][0]+ans.t[0][1])%mod;
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...