1 条题解

  • 0
    @ 2026-7-4 22:52:15

    #include <cstdio>
    #include <cassert>
    #include <iostream>
    #include <unordered_map>
    using namespace std;
    const int M = 100005;
    #define int long long
    int read()
    {
    	int x=0,f=1;char c;
    	while((c=getchar())<'0' || c>'9') {if(c=='-') f=-1;}
    	while(c>='0' && c<='9') {x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    	return x*f;
    }
    int n,m;
    unordered_map<int,unordered_map<int,int> >mp[M],h;
    int gcd(int a,int b) {return !b?a:gcd(b,a%b);}
    int exgcd(int a,int b,int &x,int &y)
    {
    	if(b==0) {x=1;y=0;return a;}
    	int d=exgcd(b,a%b,y,x);
    	y-=(a/b)*x;return d;
    }
    int inv(int a,int p)
    {
    	int x=0,y=0,d=exgcd(a,p,x,y);
    	assert(d==1);
    	return (x%p+p)%p;
    }
    signed main()
    {
    	n=read();m=read();mp[1][1][0]=2;
    	for(int x=2;x<=m;x++) if(m%x==0)
    	{
    		int a=1,b=1;h.clear();
    		for(int i=2;;i++,swap(a,b),(b+=a)%=x)
    		{
    			if(h[a].count(b)) break;h[a][b]=1;
    			int d=gcd(a,x),c=b*inv(a/d,x/d)%(x/d);
    			if(!mp[x][d].count(c)) mp[x][d][c]=i;
    		}
    	}
    	while(n--)
    	{
    		int a=read(),b=read();
    		if(!a) {puts("0");continue;}
    		if(!b) {puts("1");continue;}
    		int d=gcd(gcd(a,b),m),k=m/d;
    		a/=d;b/=d;d=gcd(b,k);
    		int c=(k-a)*inv(b/d,k/d)%(k/d);
    		if(mp[k][d].count(c))
    			printf("%lld\n",mp[k][d][c]);
    		else puts("-1");
    	}
    }
    
    
    • 1

    信息

    ID
    3681
    时间
    1000ms
    内存
    512MiB
    难度
    10
    标签
    递交数
    2
    已通过
    1
    上传者