对拍没有问题,然而一交无限超时,可能又是写炸了,觉得放一放先学BSGS吧
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll long long
using namespace std;
ll n,m,k;
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
int main()
{
int T;
scanf("%d",&T);
for (int t=1;t<=T;t++)
{
scanf("%lld%lld%lld",&n,&m,&k);
ll y=n/gcd(n,m)*m,h[109],sq=(ll)sqrt(y);
memset(h,0,sizeof(h));
for (int i=2;i<=sq;i++)
if (y%i==0)
{
h[++h[0]]=i;
while (y%i==0) y/=i;
}
if (y>1) h[++h[0]]=y;
ll l=1,r=(ll)1<<62,sans,mid,id,x;
while (l<=r)
{
mid=(l+r)>>1;
ll ans=mid;
for (int i=1;i<(1<<h[0]);i++)
{
id=0;x=1;
for (int j=0;j<h[0];j++)
if (i&(1<<j)) x=x*h[j+1],id++;
if (id&1) ans-=mid/x;else ans+=mid/x;
}
if (ans>=k) sans=mid,r=mid-1;else l=mid+1;
}
printf("Case %d: %lld\n",t,sans);
}
return 0;
}