CSU 1425 Prime Summation

  原题链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1425

  DP题。

  f[i][j]表示当前数字为i,分解式中最大质数为j的方案数,那么,状态转移方程为:

            f[i][j] = sum(f[i-j][k])

  其中,k为小于等于j的所有质数。

  求具体分解式时可以先转化为从小到大(如样例的“顺数第2”可以表述为“倒数第3”),更容易递推编程。

#include <stdio.h>
#include <string.h>

#define N 205
int n, k;

int f[N][N];

int prime[N], cnt;
bool isprime[N];

void get_prime()
{
cnt = 0;
memset(isprime, 0, sizeof isprime);
for(int i = 2; i < N; i++)
{
if(!isprime[i])
{
prime[cnt++] = i;
for(int j = i*2; j < N; j += i)
isprime[j] = true;
}
}
}

int main()
{
get_prime();
while(scanf("%d%d", &n, &k) != EOF)
{
memset(f, 0, sizeof f);
f[0][0] = 1;
for(int i = 2; i <= n; i++)
{
for(int j = 0; j < cnt; j++)
{
if(prime[j] > i) break;
for(int t = 0; t <= prime[j]; t++)
f[i][prime[j]] += f[i-prime[j]][t];
}
}
int sum = 0;
for(int i = 0; i <= n; i++)
sum += f[n][i];
if(k > sum) k = sum;
printf("%d\n%d=", sum, n);
k = sum - k;
bool flag = false;
do
{
int cnt = 0;
int i;
for(i = 2; i <= n; i++)
{
if(cnt + f[n][i] > k)
break;
cnt += f[n][i];
}
n -= i;
k = k - cnt;
if(flag) printf("+");
flag = true;
printf("%d", i);
}
while(n != 0);
printf("\n");
}
return 0;
}

CSU 1425 Prime Summation,布布扣,bubuko.com

时间: 2024-10-13 15:26:41

CSU 1425 Prime Summation的相关文章

CSU 1425 NUDT校赛 I题 Prime Summation

这个题本来有希望在比赛里面出了的 当时也想着用递推 因为后面的数明显是由前面的推过来的 但是在计算的时候 因为判重的问题 ...很无语.我打算用一个tot[i]来存i的总种树,tot[i]+=tot[j]//j为可以由j推到i的一系列数,但这样是不对的,会产生大量重复计算... 看了下标程才发现要用二维来计算出种类总数,f[i][j]+=sum(f[i-j][k]) 表示在推i数的时候,第一个素数为j的种类数,注意j一定为素数,而且k不能大于j...标程里面处理的比较简练,就学了下他的写法. 至

csu 1756: Prime

1756: Prime Submit Page   Summary   Time Limit: 3 Sec     Memory Limit: 128 Mb     Submitted: 281     Solved: 69 Description 如果a,b的最大公约数是1,说明a,b是一对互素的数,给定你n个数字,希望你找出互素的数的对数 Input 第一行输入一个正整数T,表示数据组数 每组数据第一行输入一个正整数n,表示数字的个数(n<=10000) 接下来一行输入n个正整数,每个数字大

Summation of primes

problem 10:Summation of primes 题意:求不大于200w的素数和 代码如下: 1 #ifndef PRO10_H_INCLUDED 2 #define PRO10_H_INCLUDED 3 4 #include "prime.h" 5 #include <cstring> 6 7 int p[2000000]; 8 bool vis[10000005]; 9 long long solve(){ 10 memset(vis,0,sizeof(vi

uva 11610 Reverse Prime

Problem FReverse Prime Input: Standard Input Output: Standard Output There are a few 7 digit positive numbers whose reverse number is a prime number and less than 10^6.  For example: 1000070, 1000090 and 1000240 are first few reverse prime numbers be

SPOJ 74. Divisor Summation 分解数字的因子

本题有两个难点: 1 大量的数据输入,没处理好就超时 - 这里使用buffer解决 2 因子分解的算法 a)暴力法超时 b)使用sieve(筛子),不过其中的算法逻辑也挺不容易搞对的. 数值N因子分解逻辑: 1 保存所有可以sqrt(N)范围内的质素 2 找到可以被N除尽的质素d, 然后用d去除N,使用deg变量,保存度,即有多少个d可以被N除尽 3 用d去乘所有已经找到的因子(包括1),如果度deg大于1,那么循环i从1到deg, 用d*i去乘所有找到的因子 找到所有因子相加,减去N,就是答案

UVA 10168 Summation of Four Primes(数论)

Summation of Four Primes Input: standard input Output: standard output Time Limit: 4 seconds Euler proved in one of his classic theorems that prime numbers are infinite in number. But can every number be expressed as a summation of four positive prim

CSU 1552 Friends(二分图 + 米勒测试)

题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1552 Description On an alien planet, every extraterrestrial is born with a number. If the sum of two numbers is a prime number, then two extraterrestrials can be friends. But every extraterrestr

uva 10168 Summation of Four Primes(数论-哥德巴赫猜想)

Problem A Summation of Four Primes Input: standard input Output: standard output Time Limit: 4 seconds Euler proved in one of his classic theorems that prime numbers are infinite in number. But can every number be expressed as a summation of four pos

CSU 1240

1240: 低调,低调. Time Limit: 2 Sec  Memory Limit: 1 MBSubmit: 146  Solved: 25[Submit][Status][Web Board] Description Staginner总是喜欢把自已的名字写在他出的题目里.CSU-ACM协会的会长想,这孩子是不是想出名想疯了,于是决定考一考他. 任意正整数N,不大于N且与N互质的正整数个数记为P,现在给一列与N互质的正整数,只知道一些数各出现P次,而有两个数各只出现了1次,求这两个数.