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

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

但是在计算的时候 因为判重的问题 。。。很无语。我打算用一个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. 019、Java中定义字符

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  2. 011、MySQL取14天前Unix时间戳

    #取14天前时间戳 SELECT unix_timestamp( DATE_SUB( curdate( ), INTERVAL DAY ) ); 效果如下: 不忘初心,如果您认为这篇文章有价值,认同作 ...

  3. SPI协议解析

    1. SPI物理层 SPI通讯需要使用4条线:3条总线和1条片选 . SPI遵循主从模式,3条总线分别是SCK.MOSI和MISO,片选线为nSS(低电平有效),SPI协议适用于一主多从的工作场景: ...

  4. POJO,JavaBean,entity的理解

    POJO本质是就是JavaBean JavaBean JavaBean实际上是指一种特殊的Java类,它通常用来实现一些比较常用的简单功能,并可以很容易的被重用或者是插入其他应用程序中去.所有遵循“一 ...

  5. 解决物理机U盘安装Kali Linux2018.1,光驱无法加载问题

    1.无效的方法: (1)执行 df -m,然后查看U盘设备是否挂载到了/media,导致cd-rom不能被挂载,执行 umount  /media. (2)在光驱加载安装界面,把U盘拔下换到电脑的另外 ...

  6. 【转帖】影响超 10 亿设备,博通和 Cypress 芯片曝惊天漏洞,苹果、华为、三星等中招

    影响超 10 亿设备,博通和 Cypress 芯片曝惊天漏洞,苹果.华为.三星等中招   https://www.infoq.cn/article/lpNEQGrxZL22gHDPBE2z   26 ...

  7. Python基础笔记:函数式编程:高阶函数、返回函数、匿名函数

    高阶函数 高阶函数:一个函数可以接收另一个函数作为参数 或 一个函数可以返回一个函数作为返回值,这种函数称之为高阶函数. #函数 add 接收 f 函数作为参数 >>> def ad ...

  8. 云时代架构阅读笔记七——Java多线程中如何使用synchronized关键字

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

  9. Hadoop完全高可用集群安装

    架构图(HA模型没有SNN节点) 用vm规划了8台机器,用到了7台,SNN节点没用   NN DN SN ZKFC ZK JNN RM NM node1 *     *         node2 * ...

  10. ES6与ES5的继承

    ES6 ES6中的类 类与ES5中的构造函数写法类似 区别在于属性要放入constructor中,静态方法和属性实列不会继承 <script> class Person{ height=& ...