2021“MINIEYE杯”中国大学生算法设计超级联赛(1)1007/HDU 6956 Pass!(BSGS+特征方程求数列通项)

题意:

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\n",ans);
    }
}

 

posted @ 2021-07-30 10:44  TRTTG  阅读(66)  评论(0编辑  收藏  举报