这个题本来有希望在比赛里面出了的

当时也想着用递推 因为后面的数明显是由前面的推过来的

但是在计算的时候 因为判重的问题 。。。很无语。我打算用一个tot[i]来存i的总种树,tot[i]+=tot[j]//j为可以由j推到i的一系列数,但这样是不对的,会产生大量重复计算。。。

看了下标程才发现要用二维来计算出种类总数,f[i][j]+=sum(f[i-j][k]) 表示在推i数的时候,第一个素数为j的种类数,注意j一定为素数,而且k不能大于j。。。标程里面处理的比较简练,就学了下他的写法。

至于推导出式子,则可以用递归,比较简练的是用递推。

这是错误的代码:是我之前没把种类数计算好,并且推导式子用的是递归:

#include <iostream>
#include <cstdio>
#include <cstring>
#define N 210
#define ll unsigned long long
using namespace std;
ll n,k;
int dp[N][N],count[N],vis[N];
ll tot[N];
int tmp[N],prime[N],cnt;
void init()
{
for (int i=;i<N;i++)
tmp[i]=;
for (int i=;i<N;i++){
for (int j=;j*i<N;j++){
tmp[i*j]=;
}
}
cnt=;
for (int i=;i<N;i++){
if (tmp[i]) prime[cnt++]=i;
}
// for (int i=0;i<cnt;i++)
// cout<<prime[i]<<endl;
memset(tot,,sizeof tot);
memset(count,,sizeof count);
}
void solve()
{
dp[][count[]++]=;
dp[][count[]++]=;
tot[]=tot[]=;
tot[]=;
for (int i=;i<N;i++){
memset(vis,,sizeof vis);
if (tmp[i]){
dp[i][count[i]++]=i;
vis[i]=;
tot[i]++;
}
int up=lower_bound(prime,prime+cnt,i-)-prime;
while (prime[up]>i-) up--;
for (int j=up;j>=;j--){
int num=prime[j];
bool flag=;
for (int k=count[i-num]-;k>=;k--){
if (dp[i-num][k]>num) break;
flag=;
tot[i]+=tot[dp[i-num][k]];
}
if (flag)
dp[i][count[i]++]=num;
}
}
tot[]=tot[]=;
for(int i=;i<N;i++){
tot[i]=;
for (int j=;j<count[i];j++){
tot[i]+=tot[dp[i][j]];
}
}
int test=;
for (int i=;i<count[test];i++)
cout<<i<<" !!! "<<dp[test][i]<<endl;
for (int i=;i<N;i++)
cout<<i<<" "<<tot[i]<<endl;;
}
void print(ll num,ll ret)
{
if (num==) return;
ll sum=;
int i;
ll pre=;
cout<<num<<" "<<ret<<endl;
for (i=;i<count[num];i++){
sum+=tot[num-dp[num][i]];
if (sum>=ret) break;
pre+=tot[num-dp[num][i]];
}
//if (sum>ret) i--;
// printf("%d",dp[num][i]);
//if (num-dp[num][i]>0) printf("+");
ll nt=ret-pre;
print(num-dp[num][i],nt); }
int main()
{
init();
solve();
while (scanf("%llu%llu",&n,&k)!=EOF){
printf("%llu\n",tot[n]);
if (k>tot[n]) k=tot[n];
printf("%d=",n);
print(n,k);
printf("\n");
}
}
//200 15252874192862840692

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 210
using namespace std;
int f[N][N];
int prime[N],tot[N];
void init()
{
memset(prime,,sizeof prime);
for (int i=;i<N;i++)
for (int j=i+i;j<N;j+=i) prime[j]=; //预处理出素数
memset(f,,sizeof f);
f[][]=;
for (int i=;i<N;i++)//这里处理的非常简练,因为不存在的情况全部置为了0,所以省去了各种判断和限制,而且k是不会大于j的,使得计算结果不会出现重复。
for (int j=;j<=i;j++) if (!prime[j])
for (int k=;k<=j;k++){
f[i][j]+=f[i-j][k];
}
for (int i=;i<N;i++)
for (int j=;j<=i;j++)
tot[i]+=f[i][j];
}
int n,k;
int main()
{
init();
while (scanf("%d%d",&n,&k)!=EOF){
printf("%d\n",tot[n]);
printf("%d=",n);
if (k>tot[n]) k=tot[n];
int cur=n,flag=;;
while (n>){ //递推出式子,这里也处理的比较巧妙。值得学习
if (k>f[n][cur]){
k-=f[n][cur];
cur--;
}
else
{
if (flag++) printf("+");
printf("%d",cur);
n-=cur;
}
}
printf("\n");
}
return ;
}

CSU 1425 NUDT校赛 I题 Prime Summation的更多相关文章

  1. PKU2018校赛 H题 Safe Upper Bound

    http://poj.openjudge.cn/practice/C18H 题目 算平均数用到公式\[\bar{x}=\frac{x_1+x_2+x_3+\cdots+x_n}{n}\] 但如果用in ...

  2. 2018WFU校赛B题

    我们在ACM的题目中已经了解了什么是ACM了,ACM还是很残酷的了(ಥ _ ಥ),那么现在你就要解决一个ACM最简单的题了,简单到省赛和区域赛都不会出这种简单的题.ls很强,即使每年都在ACM这个大坑 ...

  3. 牛客网 2018年东北农业大学春季校赛 L题 wyh的天鹅

    链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288 ...

  4. QAU 17校赛 J题 剪丝带(完全背包变形)

    题意: 剪一段丝带,对于剪完后的每一段丝带长度必须是a,b,c 输入丝带的长度  n 和  a  b  c 输出一个整数,代表最多能剪成多少段 样例输入 5 5 3 2 7 5 5 2 样例输出 2 ...

  5. 上海高校金马五校赛 F题:1 + 2 = 3?

    链接:https://www.nowcoder.com/acm/contest/91/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言26214 ...

  6. 福建工程学院第十四届ACM校赛M题题解 fwt进阶,手推三进制fwt

    第九集,结束亦是开始 题意: 大致意思就是给你n个3进制的数字,让你计算有多少对数字的哈夫曼距离等于i(0<=i<=2^m) 思路: 这个是一个防ak题,做法是要手推公式的fwt 大概就这 ...

  7. 福建工程学院第十四届ACM校赛G题题解

    外传:编剧说了不玩游戏不行 题意: 有n个石堆,我每次只能从某一堆中取偶数个石子,你取奇数个,我先手,先不能操作的人输.问最后谁能赢. 思路: 这个题仔细想想,就发现,取奇数的人有巨大的优势,因为假设 ...

  8. 福建工程学院第十四届ACM校赛B题题解

    第二集,未来的我发量这么捉急的吗 题意: 有n个数,请问有多少对数字(i,j)(1<=i<j<=n),满足(a[i]^a[j])+((a[i]&a[j])<<1) ...

  9. 记校赛水题----AK爷兼职计

    Description AK爷最近收到一份兼职,是去幼儿园看小朋友,AK爷认为看孩子这件事情很简单,但是事实并非如此.幼儿园里的孩子们喜欢数学,不仅九九乘法口诀倒背如流而且精通各种算法.某天,AK爷上 ...

随机推荐

  1. BBS那些事儿

    目录 1 注册 2 登陆 3 图片验证码相关 4 首页相关,Django Admin后台录入数据 5 注销功能 6 修改密码 7 用户头像展示,media配置 8 个人站点,个人侧边栏 9 侧边栏筛选 ...

  2. UVA - 1152 4 Values whose Sum is 0(中途相遇法)

    题意:从四个集合各选一个数,使和等于0,问有多少种选法. 分析:求出来所有ai + bi,在里面找所有等于ci + di的个数. #pragma comment(linker, "/STAC ...

  3. 四十八、在SAP中函数参数的使用

    一.不带参数的函数定义如下 二.我们把函数内部会变化的变量以参数的形式定义,其中USING和CHANGING分别表示变量和返回值,因为so_car表示的是工作区,所以后面加上[]符号. 三.我们把2个 ...

  4. JAVA的控制结构

    一.控制结构 1.控制结构概述 控制结构是控制程序如何运行的特殊的语句结构.控制结构可以分为:顺序控制结构,分支控制结构和循环控制结构. 2.顺序控制结构 除了分支控制结构和循环控制结构之外的语句都是 ...

  5. NiFi之Processor配置

    Processor(处理器)之配置 选择一个Processor,比如ExecuteSQL,从它的名字可以看出该处理器的功能就是去执行一个sql(当然是执行的该sql必须要有返回值的),下面就以Exec ...

  6. css 基础知识 (待完善...)

    CSS   1.position 属性     对元素进行定位.       absolute         相对于 非static类型的position 的 第一个(临近的) 父元素 进行定位. ...

  7. JS location.href传参及接受参数

    当前页面传参 window.location.href= + "&name="+"zhangchenxao"; 下个页面接受参数 var url = l ...

  8. 设置此div的子元素居中显示

    下面样式设置到父div上: .modal { display: flex; align-items: center; /*竖直居中 垂直居中*/ justify-content: center; /* ...

  9. PAT Advanced 1072 Gas Station (30) [Dijkstra算法]

    题目 A gas station has to be built at such a location that the minimum distance between the station an ...

  10. jmeter --- 组件