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

来源:互联网 发布:图像在线批处理软件 编辑:程序博客网 时间:2024/06/05 19:15


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[N];//f[N]代表非约数个数为n的最小xvoid 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[n];        }        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;}


0 0
原创粉丝点击