您的位置:首页 > 其它

HDU4542 小明系列故事—未知剩余系

2015-09-29 16:24 447 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4542

分析:详见上上上篇博文

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Tmax=500005,pri[20]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
const unsigned long long int inf=4611686018427387904;
int n,ORZ[Tmax];
unsigned long long int ans;
void init()
{
int i,j;
for(i=1;i<=Tmax-1;i++)
ORZ[i]=i-1;
for(i=2;i<=Tmax-1;i++)
{
for(j=i;j<=Tmax-1;j+=i)
ORZ[j]--;
if(ORZ[ORZ[i]]==0) ORZ[ORZ[i]]=i;
ORZ[i]=0;
}
return;
}
void dfs(int p,unsigned long long int sum,int num,int limit)
{
if(num>n) return ;
if(num==n) {
ans=min(ans,sum);
return;
}
int i;
for(i=1;i<=limit;i++)
{
if(ans/pri[p]<sum||num*(i+1)>n) break;
sum*=pri[p];
if(n%(num*(i+1))==0)
dfs(p+1,sum,num*(i+1),i);
}
return;
}
int main()
{
int T,kase=0,type;
init();
scanf("%d",&T);
while(T--)
{
ans=inf;
scanf("%d%d",&type,&n);
if(type==1) ans=ORZ
;
else dfs(1,1,1,63);
printf("Case %d: ",++kase);
if(ans>=inf) printf("INF\n");
else if(ans==0) printf("Illegal\n");
else printf("%llu\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: