南昌网络赛The Nth Item 暴力快速幂+unordered_map记忆化
注意:记忆化不能写到快速幂求解函数里,不断调用函数会造成很大的时间浪费
#include<bits/stdc++.h> using namespace std; #define sc(x) scanf("%lld",&x); #define si signed #define int long long #define P pair<int,int> #define fi first #define se second #define read(A) for(int i=0;i<n;i++) scanf("%lld",&A[i]); #define push_back pb int A[2][2]={{3,2},{1,0}}; int B[2][2]; int C[2][2]; int D[2][2]; int Q,N; #define mod 998244353 #define maxn 100000+10 void mut(int A[][2],int B[][2]) { C[0][0]=((A[0][0]*B[0][0])%mod+(A[0][1]*B[1][0])%mod)%mod; C[0][1]=((A[0][0]*B[0][1])%mod+(A[0][1]*B[1][1])%mod)%mod; C[1][0]=((A[1][0]*B[0][0])%mod+(A[1][1]*B[1][0])%mod)%mod; C[1][1]=((A[1][0]*B[0][1])%mod+(A[1][1]*B[1][1])%mod)%mod; for(int i=0;i<=1;i++){ for(int j=0;j<=1;j++){ A[i][j]=C[i][j]; } } } unordered_map<int,int> mp; int qp(int n) { if(n==1)return 1; if(n==0)return 0; n-=1; int Ans[2][2]={{1,0},{0,1}}; for(int i=0;i<2;i++){ for(int j=0;j<2;j++){ B[i][j]=A[i][j]; } } while(n){ if(n&1){ mut(Ans,B); } mut(B,B); n>>=1; } return Ans[0][0]; } si main() { scanf("%lld%lld",&Q,&N); int ans=0; while(Q--){ int a; if(mp[N%499122176]){ a=mp[N%499122176]; } else{ mp[N%499122176]=a=qp(N%499122176); } ans^=a; N=((N^(a*a))); } cout<<ans<<' '; }