33pts拼尽全力无法战胜
查看原帖
33pts拼尽全力无法战胜
750598
Prophet_Inkpigeon楼主2024/12/13 10:35

只能过第一个点;;

经检查发现代码 ll 过大时会输出 00,但精度没有爆炸,因此本人找不到输出 00 的原因。

代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll read()
{
	short f=1;ll x=0;char s=getchar();
	while(s<48||s>57){f=s=='-'?-1:1;s=getchar();}
	while(s>=48&&s<=57){x=x*10+s-48;s=getchar();}
	return x*f;
}
ll pri[3005];int tot,t;
ll phi(ll n)
{
	ll ans=n;
	for(ll i=2;i<=n/i;++i)
		if(ans%i==0)
		{
			ans=ans-ans/i;
			while(n%i==0)n=n/i;
		}
	if(n>1)ans=ans-ans/n;
	return ans;
}
__int128 ksm(__int128 x,ll y,ll p)
{
	__int128 a=1;x=x%p;
	while(y)
	{
		if(y&1)a=a*x%p;
		x=x*x%p;y=y>>1;
	}
	return a;
}
int main()
{
	ll l,nl;bool z;
	while(l=read())
	{
		++t;tot=0;z=0;
		l=l*9/__gcd(l,8ll);
		nl=phi(l);
		for(ll i=1;i<=nl/i;++i)
			if(nl%i==0)
			{
				pri[++tot]=i;
				if(nl/i!=i)pri[++tot]=nl/i;
			}
		sort(pri+1,pri+tot+1);
		printf("Case %d: ",t);
		for(int i=1;i<=tot;++i)
			if(ksm(10,pri[i],l)==1)
			{
				printf("%lld\n",pri[i]);
				z=1;break;
			}
		if(!z)puts("0");
	}
	return 0;
}
2024/12/13 10:35
加载中...