题意:
求x内约数为k的最小的数,以及求x内约数是x-k的最小的数。
解题思路:
第一种数用dfs去搜索就行了,第二种的话,先打个表跑出来即可。
代码:
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const unsigned long long inf=~0ULL;
const long long INF = (1LL<<62)+1;
int p[16] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
int a[100000+100];
int b[147777+100];
unsigned long long c[100000+100];
int d[50005];
void init()
{
for(int i=1; i<=50005; i++)
{
a[i]=i;
}
int i, j;
int x=0;
for(i=1; i<=50006; i++)
{
for(j=i; j<=50005; j+=i)
{
a[j]--;
}
if(b[a[i]]==0){b[a[i]]=i;x=max(i, x);}
}
// printf("%d\n", a[100000]);
}
int n;
unsigned long long ans;
void dfs(int dept, int limit, unsigned long long tmp, int num)
{
if(num>n)return;
if(num==n){ans=min(tmp, ans);}
for(int i=1; i<=limit; i++)
{
if(inf/p[dept]<tmp || num*(i+1)>n)break;
tmp*=p[dept];
if(n%(num*(i+1))==0)
dfs(dept+1, i, tmp, num*(i+1));
}
return;
}
int main()
{
init();
int tt=1, t, i;
/*
for(i=1; i<=47777; i++)
{
ans=inf;
n=i;
dfs(0, 1, 1);
c[i]=ans;
}
*/
cin>>t;
while(t--)
{
int x;
cin>>x>>n;
printf("Case %d: ", tt++);
if(x==0)
{
ans=inf;
dfs(0, 62, 1ULL, 1);
}
else
{
ans=b[n];
}
if(ans==0)
{
puts("Illegal");
}
else if(ans>=INF)puts("INF");
else cout<<ans<<endl;
}
}