您的位置:首页 > 其它

hdu4542 小明系列故事——未知剩余系(反素数打表待改!!不会!!)

2017-02-27 21:47 197 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4542

这道题时间卡的也太紧了换着打了几种表都不行,看了下别人的表打的都莫名其妙,里面的剪枝也被弄懂,直接绕晕了。。用别人的代码改了改,改天在看这题。。

#include <stdio.h>
#include <algorithm>
#include <string.h>

using namespace std;

typedef long long ll;
const int N = 50005;//互质数的个数不超过k最大值
const ll INF = (((ll)1)<<62)+1;

int p[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};

ll ans, n;//ans表示满足约数为n的反素数,通过多次贪心求的最小值
int num
;//f
代表非约数个数为n的最小x

void table()
{
/*  num[1] = num[2] = 0;
for(int i = 3; i <= N; i++)
{
num[i] = i;
for(int j = 1; j <= (i/2+1); j++)
{
if(i%j == 0) num[i]--;
}
num[i]--;
}
memset(f, 0, sizeof(f));
for(int i = 1; i <= N; i++)
{
if(f[num[i]] == 0) f[num[i]] = i;
}*/
for(int i=1;i<N;i++) num[i] = i;
for(int i=1;i<N;i++)
{
for(int j=i;j<N;j+=i) num[j]--;
if(!num[num[i]]) num[num[i]] = i;
num[i] = 0;
}
}

void dfs(ll step, ll cur, ll cnt, ll Maxnum)//cur表示当前因子个数所对应的反素数,cnt表示当前因子个数
{
if(cnt > n) return;
if(cnt==n && cur<ans) ans = cur;//更新最小反素数
ll tmp = cur;//在原先反素数的基础上乘第step个素数
for(int i = 1; i <= Maxnum; i++)//枚举第step个素数的个数
{
if(ans / p[step] < tmp || cnt*(i+1) > n) break;
tmp *= p[step];
/* tmp*=p[step];
if(tmp>ans || (cnt*(i+1))>n) break;//若乘上这个质因子超过了已知最大反素数,不满足求最小反素数的条件,返回*/
if(n%(cnt*(i+1))==0)
dfs(step+1, tmp, cnt*(i+1), i);//下一个质因子肯定个数要比这个少,因子个数累乘
}
}

int main()
{
//  freopen("in.txt", "r", stdin);
int t, type, Case = 1;
table();
/*  for(int i = 1; i <= 20; i++)
{
printf("%d %lld\n", i, num[i]);
}*/
scanf("%d", &t);
while(t--)
{
//  ans = 0;
scanf("%d%lld", &type, &n);
if(type == 1)
{
ans = num
;
}
else if(type == 0)
{
ans = INF;
dfs(0, 1, 1, 62);
}
printf("Case %d: ", Case++);
if(ans == 0) printf("Illegal\n");
else if(ans >= INF) printf("INF\n");
else printf("%lld\n", ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu