社区讨论

萌新求助

P2485[SDOI2011] 计算器参与者 16已保存回复 16

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
16 条
当前快照
1 份
快照标识符
@mi7wvjkc
此快照首次捕获于
2025/11/21 04:56
4 个月前
此快照最后确认于
2025/11/21 06:35
4 个月前
查看原帖
萌新刚学数论,一直75,求助=w=
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
int t,k;
int ksm(int a,int b,int c)
{
	int res=1;
	while(b)
	{
		if(b&1)
		{
			res=res*a%c;
		}
		a=a*a%c;
		b>>=1;
	}
	return res;
}
main()
{
	cin>>t>>k;
	if(k==1)
	{
		while(t--)
		{
			int x,y,z;
			scanf("%lld%lld%lld",&x,&y,&z);
			printf("%lld\n",ksm(x,y,z));
		}
		return 0;
	}
	if(k==2)
	{
		while(t--)
		{
			int x,y,z;
			scanf("%lld%lld%lld",&x,&y,&z);
			x%=z;
            y%=z;
            if(x==0&&y!=0)
			{
                printf("Orz, I cannot find x!\n");
                continue;
            }
            printf("%lld\n",ksm(x,z-2,z)*y%z);
		}
		return 0;
	}
	while(t--)
	{
		map<int,int> mp,j;
		int a,b,p;
		cin>>a>>b>>p;
	    int m=sqrt(p);
	    for(int i=0;i<=m;i++)
	    {
	        mp[b]=1;
	        j[b]=i;
	        b=b*a%p;
	    }
	    int k=ksm(a,m,p),k1=k,flag=1;
	    for(int i=1;i<=m;i++)
	    {
	        k1%=p;
	        if(mp[k1])
	        {
	            printf("%lld\n",i*m-j[k1]);
	            flag=0;
	            break;
	        }
	        k1*=k;
	    }
		if(flag)
		{
			printf("Orz, I cannot find x!\n");
		}
	}
}

回复

16 条回复,欢迎继续交流。

正在加载回复...