FAFU 1411 质数之和
来源:互联网 发布:一级office考试软件 编辑:程序博客网 时间:2024/06/04 17:48
题意:任何一个大于1的正整数N都能分解成多个质数之和,并且这种分解式可以有多种。例如N=9就可以有M=4种分解式:9=7+2=5+2+2=3+3+3=3+2+2+2。我们把7+2=2+7看成是同一种分解式,如果分解式中的质数相同次序不同,取质数由大到小排序的那个分解式。给定两个正整数N和K, 求出M,再输出第K大的和式。
思路:背包+贪心吧
/* author:ray007great version:1.0*/#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<cstdlib>#include<cmath>#include<vector>#include<set>#include<map>#include<string>#include<time.h>#include<queue>using namespace std;typedef long long ll;//c++#pragma comment(linker, "/STACK:102400000,102400000")// g++//int size = 256 << 20; // 256MB//char *p = (char*)malloc(size) + size;//__asm__("movl %0, %esp\n" :: "r"(p) );#define sf(a) scanf("%d",&a)#define sfs(a) scanf("%s",a)#define sfI(a) scanf("%I64d",&a)#define pf(a) printf("%d\n",a)#define pfI(a) printf("%I64d\n",a)#define rep(i,a,b) for(int i=(a);i<=(b);i++)#define repd(i,a,b) for(int i=(a);i>=(b);i--)#define rep1(i,a,b) for(int i=(a);i<(b);i++)#define clr(a) memset(a,0,sizeof(a))#define clr1(a) memset(a,-1,sizeof(a))#define pfk printf("fuck\n")/* define *//* clock *///clock_t start, finish;//start = clock();//finish = clock();//double duration = (double)(finish - start)/CLOCKS_PER_SEC;//printf( "%.10f seconds\n", duration );/* clock *//* data *//* data */int pr[200];int dp[250][100];vector<int> ans;int n,k;bool isPrime(int x){ if(x==2) return 1; for(int i=2;i<x;i++){ if(x%i==0) return false; } return true;}void dfs( int v, int now ){ if( v == 0) return ; while( v < pr[ now ] ) now--; if(now == 0) return ; if( dp[ v - pr[ now ] ][ now ] >= k ) { ans.push_back( pr[now] ); dfs( v - pr[now], now ); } else{ k -= dp[ v - pr[ now ] ][ now ]; dfs( v, now - 1); }}int main(){ int cnt=0; for(int i = 2; i <= 200; i++){ if( isPrime(i) ) pr[ ++cnt ]=i; } while(cin>>n>>k){ if(n + k == 0) return 0; clr(dp); for(int i = 1; i<= cnt; i++) dp[0][i] = 1; for(int l = 1; l <= cnt; l++){ for(int i = 1; i <= l; i++){ for(int j = pr[i]; j <= n; j++){ dp[j][l] += dp[j-pr[i]][l]; } } } if(k > dp[ n ][ cnt ]) k = dp[n][ cnt ]; cout<< dp[ n ][ cnt ] <<endl; int now = cnt; while( pr[ now ] > n ) now--; ans.clear(); dfs( n, now ); int sz = ans.size(); cout<< n << "="; for(int i = 0; i < sz; i++) if(i) cout<< "+" << ans[i]; else cout<< ans[i]; cout<< endl; } return 0;}// 159 1// 200 209
0 0
- FAFU 1411 质数之和
- FAFU OJ 素数之和
- 寻找质数之和
- 编写一个程序求质数之和
- 求前N个质数之和
- 任意数内质数与其之和 shell
- 欧拉.H3501互质数之和
- acm竞赛题目连续质数之和
- 将一个大于6的偶数拆成俩质数之和
- 100以内的素数(又称之为质数)之和
- 检查一个数能不能表示成两个质数之和
- 检查一个数能不能表示成两个质数之和
- 300-500内的质数(素数)个数和前10个最大的质数之和算法
- 从1到100以内的偶数和质数之和(质数和有误)
- 质数
- 质数
- 质数
- 质数
- DDR 了解
- 过了几天“温水”日子。
- Codeforces373B_Making Sequences is Fun_枚举长度。。。
- SNMP MIB完整手册
- 汪峰章子怡或登湖南春晚 跨年费用仅往年1/3
- FAFU 1411 质数之和
- hadoop集群job出现一个奇怪的问题
- 关于企业版 OTA发布
- 卡车能行驶到的最远距离 50 trucks with payload
- 【学习笔记】逻辑回归模型原理与应用
- ubuntu11.10搭建eclipse C++开发环境
- [IOS开发]自定义使用AVCaptureSession 拍照,摄像,载图总结
- IOS上传图片方法类
- linux下安装mysql数据库以及出现的错误