1. 程式人生 > >p1273 質數和分解(完全揹包)

p1273 質數和分解(完全揹包)

題目

https://www.luogu.org/problemnew/show/P2563

題解

1.碼出素數表,
2.接下來是重點,重點,重點!!! 重要的事情說三遍
很多人不知道狀態轉移方程f[j]+=f[j-prime[i]]的意義
可以這麼理解,一個數要拆成若干素數和,等同於拆成所有該數減去一個素數差的方案數之和(轉自某位大佬)
舉個例子:
模擬一下7質因數分解
f[0]=1//初始化
f[1]=0//1不能被任何質數分解
f[2]=1//2能被2分解
f[3]=1//被3分解
f[4]=1//被2分解
f[5]=2//這裡就是重點了,5能被5分解,也能被2,3分解
而你自己舉個數,模擬一遍,自然而然就知道是怎麼累加方案數的了!!!(學不懂的東西,模擬是好方法)


3.記得在前面初始化f[0]=1,否則。。。。。。。。。。你懂得

程式碼

#include<bits/stdc++.h>
using namespace std;
int prime[501],f[501];
bool isprime(int x)
{
    for(int i=2;i<=sqrt(x);i++)
        if(x%i==0) return 0;
    return 1;
}
int main()
{
    int n;
    while(cin>>n)
    {
        int num=0;
        for(int i=
2;i<=n;i++) if(isprime(i)) prime[++num]=i; memset(f,0,sizeof(f)); f[0]=1; for(int i=1;i<=num;i++) { for(int j=prime[i];j<=500;j++) f[j]+=f[j-prime[i]]; } cout<<f[n]<<endl;
} return 0; }

小結

這道題,本來是興致勃勃的想到了思路,打了半天,竟然被全部T掉了。。。。。。。。。。之後換了最慢的cin,A了,我之前打的是快讀啊!!!!!
好坑。。。。。。。。。。。

眾人皆醉我獨醒,舉世皆濁我獨清。——戰國楚 三閭大夫 屈平 字原