玄关:矩阵快速幂+__int128 0分求调

P2044 [NOI2012] 随机数生成器

@[yaodiguoan](/user/1023793) ```cpp node anss=other*ans; ``` 这个,是不是应该是 ```cpp node anss=ans*other ``` 因为矩阵乘法不满足交换律。 以及上面的矩阵乘法也要改;而且你的矩阵乘法似乎写错了。
by FFTotoro @ 2024-04-15 09:52:19


@[zyc212303](/user/556366) 谢谢,已关
by danlao @ 2024-04-15 11:48:55


@[zyc212303](/user/556366) [重写了一下,还是零分](https://www.luogu.com.cn/record/155909964)
by danlao @ 2024-04-15 14:04:48


@[zyc212303](/user/556366) [把 `n>>=1` 改了还是0分 ](https://www.luogu.com.cn/record/155910172)
by danlao @ 2024-04-15 14:08:26


@[yaodiguoan](/user/1023793) 全都是无法查看评测记录。你问问题至少别为难别人。 而且你的矩阵乘法**写错了**,建议重新学一下。 ```cpp ans.m[j][k]=(ans.m[j][k]+x.m[j][i]*y.m[i][k])%mod; ``` 才是对的吧。。。
by FFTotoro @ 2024-04-15 14:24:28


@[zyc212303](/user/556366) 哦,忘了我没进代码公开计划 代码: ``` #include <bits/stdc++.h> using namespace std; #define hh putchar('\n') #define kg putchar(' ') //#define int long long #define int __int128 namespace quickread{ inline int read(){ int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline void write(int x){ if(x<0){putchar('-');x=-x;} if(x>9)write(x/10); putchar(x%10+'0'); } } using namespace quickread; const int N=1e6+10; int mod; struct node{ int mat[5][5],n,m; node(int n1,int m1){memset(mat,0,sizeof(mat)),n=n1,m=m1;} void build1(int a,int b){mat[1][1]=a;mat[2][1]=b;} void build2(int a){mat[1][1]=a,mat[1][2]=mat[2][2]=1;} }; node operator * (const node & a,const node & b){ node ans(a.n,b.m); for(int i=1;i<=ans.n;i++) for(int j=1;j<=ans.m;j++) for(int k=1;k<=a.m;k++) ans.mat[i][j]=(ans.mat[i][j]+a.mat[i][k]*b.mat[j][k] % mod)%mod; return ans; } int n,a,c,g,x0; signed main(){ // ios::sync_with_stdio(0); // cin.tie();cout.tie(); mod=read(),a=read(),c=read(),x0=read(),n=read(),g=read(); node ans(2,1),a1(2,2); ans.build1(x0,c),a1.build2(a); while(n){ if(n&1) ans=a1*ans; a1=a1*a1; n/=2; } write(ans.mat[1][1]%g); return 0; } ```
by danlao @ 2024-04-15 20:13:03


@[yaodiguoan](/user/1023793) 你矩阵乘法还是错的。 ```cpp ans.mat[i][j]=(ans.mat[i][j]+a.mat[i][k]*b.mat[j][k] % mod)%mod; // 这是错的 ans.mat[i][j]=(ans.mat[i][j]+a.mat[i][k]*b.mat[k][j] % mod)%mod; // 这是对的 ``` 你从哪学的?建议**重学**。 变量的顺序背不住你去贺题解吧。。。这种真的,,,你连矩乘的意义都没理解就在那死背。。。
by FFTotoro @ 2024-04-15 20:54:29


[把上面的矩阵乘法一改,这不就过了,,,](https://www.luogu.com.cn/record/155957801)
by FFTotoro @ 2024-04-15 20:56:38


@[zyc212303](/user/556366) 谢谢大佬怒喷!我这就去重学!
by danlao @ 2024-04-15 20:57:39


@[zyc212303](/user/556366) 刚去oi-wiki上看了,是我没搞懂,谢谢大佬指出我的错误!
by danlao @ 2024-04-15 21:09:22


| 下一页