这道题有点绕。。先附上大佬博客Orz:https://www.cnblogs.com/Konjakmoyu/p/5183285.html
做这道题要知道以下两点:
1. gcd(b*t+a, b) = gcd(a, b) t为任意整数
因此如果a与b不互质,则b*t+a与b也一定不互质
2.与m互素的数对m取模具有周期性(不一定从1到m)
假设小于m且与m互质的数有l个,其中第i个是ai,则第t*l+i个与m互质的数是t*m+ai。
注意要特判k%l==0的情况,此时t属于前一组。
附上AC代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const int INF=0x3f3f3f3f;
const ll MOD=1e9+7ll;
const ll MAX=1000005;
ll m,k;
int mo[MAX];
ll gcd(ll a,ll b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main()
{
while(cin>>m>>k)
{
if(k==1)
{
printf("1\n");
continue;
}
if(m==1)
{
cout<<k<<endl;
continue;
}
int l=0;
mo[++l]=1;
for(int i=2;i<m;i++)
{
if(gcd(m,i)==1)
mo[++l]=i;
}
//cout<<"l="<<l<<endl;
ll t=k/l;
ll ans=0;
if(k%l==0)
ans=(t-1)*m+mo[l];
else
ans=t*m+mo[k%l];
cout<<ans<<endl;
}
return 0;
}
另外有人说用容斥原理+dfs+二分,这对我来说有点难,就先不写了。。