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

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

但是在计算的时候 因为判重的问题 。。。很无语。我打算用一个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. Python 使用 requests 模块发送请求的使用及封装

    一.requests 模块基本使用 1.准备接口的URL.请求参数.请求头 # 1. 构造注册.登录.充值请求的url register_url = "注册url" login_u ...

  2. 7.11 如何应用Varnish

    动态数据缓存 Step 1 修改devault.vcl文件 # This ) # man page for details on VCL syntax and semantics. # # Defau ...

  3. HTTP实战

    1.建立http服务,要求: (1)提供两个基于名称的虚拟主机: www1.stuX.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1/erro ...

  4. linux扩容空间,再扩容文件系统

    Linux磁盘空间进行扩容 参考博客 http://blog.csdn.net/dingchenxixi/article/details/50986472 http://blog.sina.com.c ...

  5. 每天一点点之 uni-app 框架开发 - 页面滚动到指定位置

    项目需求:在页面中,不管位于何处,点击评论按钮页面滚动到对应到位置 实现思路如下: uni.createSelectorQuery().select(".comment").bou ...

  6. SYSTEMTIME 获取日期之差

    #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <string.h& ...

  7. python计算:pi/4=1-1/3+1/5-1/7+…

    当有一项的绝对值小于10e-6停止计算 def cul() : ans = 0;add = 1 sign = 1 while(1/add>10**(-6)) : ans = ans + sign ...

  8. 云时代架构阅读笔记六——Java内存模型详解(二)

    承接上文:云时代架构阅读笔记五——Java内存模型详解(一) 原子性.可见性.有序性 Java内存模型围绕着并发过程中如何处理原子性.可见性和有序性这三个特征来建立的,来逐个看一下: 1.原子性(At ...

  9. Ajax学习系列——向服务器发送请求

    1.如何发送请求? 如果需要向服务器发送请求,我们使用的是XMLHttpRequest对象中的open()和send()方法. var xhr = new XMLHttpRequest();//具体创 ...

  10. 五十三、SAP中创建一个LVC表格

    一.我们打开之前的程序,在函数里面创建一个名字为SHOW_DATA_LVCE的函数 二.点击编辑->模式 三.选择'REUSE_ALV_GRID_DISPLAY_LVC' 四.选择调用功能,点击 ...