题意:
n个人传球,第0秒球在第1个人手中,球每1秒都要传给别的人。
t秒后,球在第1个人手中的传球总方案数为x(mod 998244353)。
给出n和x,求最小的t
#include<bits/stdc++.h> using namespace std; const int mod=998244353; map<int,int>mp; int main() { int T,n,x,m,mul,a0,a1,tmp,ans,mmul; m=ceil(sqrt(mod)); scanf("%d",&T); while(T--) { scanf("%d%d",&n,&x); mp.clear(); mul=1; a0=((1ll*n*x+1-n)%mod+mod)%mod; a1=((1ll*n*x+n-1)%mod+mod)%mod; for(int i=0;i<=m;++i) { if(!(i&1)) tmp=a0; else tmp=a1; tmp=1ll*tmp*mul%mod; mp[tmp]=i; mul=1ll*mul*(n-1)%mod; } ans=-1; mul=1; for(int i=1;i<=m;++i) mul=1ll*mul*(n-1)%mod; mmul=1; for(int i=1;i<=m;++i) { mmul=1ll*mmul*mul%mod; if(mp.find(mmul)!=mp.end()) { ans=i*m-mp[mmul]; break; } } printf("%d ",ans); } }