有了DFS解容斥问题的思路..这题不难想...若一个数x与所给的m互质..则说明x与h的GCD==1...将m因式分解,对于一个确定的上限...可以通过DFS对这些质因数解容斥求出当前上限下有多少个与m不互质的数...从而又能得到当前上限下有多少个与m互质的数...
想到了这一步..就不难想到2的思路了...通过2分夹逼找到所需的数...并且数据范围m<=100000..在这个范围内因式分解..最多也不会超过6个质因数.{2,3,5,7,11,13}已经超过100000..显然时间上是绝对能秒杀的...
Program:
#include<iostream>
#include<string.h>
#include<stdio.h>
#define ll long long
using namespace std;
ll n,m,a[25],ans,p,t,h,l,r,mid;
void DFS(ll i,ll w,ll k)
{
for (;i<=n;i++)
if (a[i])
{
p=a[i]*w;
h+=k*(mid/p);
DFS(i+1,p,-k);
}
return;
}
int main()
{
ll i;
while (cin>>m>>t)
{
n=0;
for (i=2;i<=m;i++)
if (m%i==0)
{
while (m%i==0) m/=i;
a[++n]=i;
if (m==1) break;
}
r=1;
while (1)
{
mid=r;
h=0;
DFS(1,1,1);
if (mid-h<t) r*=2;
else break;
}
l=1;
while (r-l>1)
{
mid=(l+r)/2;
h=0;
DFS(1,1,1);
if (mid-h>=t) r=mid;
else l=mid;
}
cout<<r<<endl;
}
return 0;
}