p1273 質數和分解(完全揹包)
阿新 • • 發佈:2018-11-27
題目
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了,我之前打的是快讀啊!!!!!
好坑。。。。。。。。。。。
眾人皆醉我獨醒,舉世皆濁我獨清。——戰國楚 三閭大夫 屈平 字原