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 4542 小明系列故事——未知剩余系 反素数 + 打表
- HDU4542-小明系列故事——未知剩余系(数论)
- HDU4542 小明系列故事——未知剩余系
- HDU4542 小明系列故事—未知剩余系
- HDU4542小明系列故事——未知剩余系 (反素数+DFS+打表)
- 小明系列故事——未知剩余系(反素数,好)
- hdu 4542 小明系列故事——未知剩余系
- hdu 4542 小明系列故事——未知剩余系 数论
- 集训队专题(8)1005 小明系列故事——未知剩余系
- HDU 4542 小明系列故事——未知剩余系
- HDU 4542 小明系列故事——未知剩余系(反素数+最小的n使得n的约数为n-k(k已知))
- 小明系列故事——未知剩余系
- hdoj 小明系列故事——未知剩余系 4542 (反素数&剪枝) 好题
- HDU 4542:小明系列故事——未知剩余系
- HDU 4542 小明系列故事——未知剩余系 (数论)
- HDU 4542 小明系列故事——未知剩余系 (DFS 反素数 筛子预处理)
- 小明系列故事——未知剩余系
- HDOJ 4542 小明系列故事——未知剩余系(反素数)
- HDU 4501 小明系列故事——买年货(多维背包)
- HDU4506 小明系列故事——师兄帮帮忙【水题】