時間限制: 1 sec 記憶體限制: 128 mb
題目描述
美羊羊給喜羊羊和沸羊羊出了一道難題,說誰能先做出來,我就獎勵給他我自己做的一樣禮物。沸羊羊這下可樂了,於是馬上答應立刻做出來,喜羊羊見狀,當然也不甘示弱,向沸羊羊發起了挑戰。
可是這道題目有一些難度,喜羊羊做了一會兒,見沸羊羊也十分頭疼,於是就來請教你。
題目是這樣的:
把自然數n(n<=100)分解為若干個自然數之和,求出有幾種情況。
如n=5時,有7種情況
5=1+1+1+1+1
5=1+1+1+2
5=1+1+3
5=1+2+2
5=1+4
5=2+3
5=5怎麼樣?你要加油幫助喜羊羊哦!
輸入乙個自然數n(n<=100)
輸出無序拆分的種數。
複製樣例資料
5樣例輸出
71.遞迴,超級慢
/**/
#include #include #include #include #include #include #include #include #include #include #include #include typedef long long ll;
using namespace std;
int n;
int dp(int x, int y)這一種
return 1;
}else if(x == y)一種,第二種就是分比y小的數
return 1 + dp(x, x - 1);
}else if(x < y)else if(x > y)
}int main()
/**/
2.dp
/**/
#include #include #include #include #include #include #include #include #include #include #include #include typedef long long ll;
using namespace std;
int n;
int dp[105][105];
int main()
} printf("%d\n", dp[n][n]);
return 0;
}/**/
3.母函式
f(x)=(1+x^1+x^2+x^3....+x^n)*(1+x^2+x^4+...)*.....(1+x^n);
上面的就是母函式。。。應該就是這樣
然後首先數為n的被分數,可以由1,2,3,4,......,n組成,就是不知道選1幾個,選2幾個。。。
這時候我們可以看一下母函式,設選的數字為i,選的次數為k,那麼x的指數可以表示為x^(i*k);
就像f(x)中(1+x^1+x^2+x^3....+x^n)表示1不選,1選一次,1選2次....; (1+x^2+x^4+...)表示2不選,2選1次,選2次。。。
那麼我們要求的分解n的種數就是x^n前的係數(很容易想)。
怎麼求x^n的係數呢,多項式相乘解決。
/**/
#include #include #include #include #include #include #include #include #include #include #include #include typedef long long ll;
using namespace std;
int n;
int num1[105], num2[105];
int main()
} memcpy(num1, num2, sizeof(num2));
memset(num2, 0, sizeof(num2));
} printf("%d\n", num1[n]);
return 0;
}/**/
自然數無序拆分
原 2018年12月09日 12 10 27 oneplus123 時間限制 1 sec 記憶體限制 128 mb 題目描述 美羊羊給喜羊羊和沸羊羊出了一道難題,說誰能先做出來,我就獎勵給他我自己做的一樣禮物。沸羊羊這下可樂了,於是馬上答應立刻做出來,喜羊羊見狀,當然也不甘示弱,向沸羊羊發起了挑戰。...
自然數無序拆分
includeusing namespace std int n int dfs int x,int y int main includeusing namespace std int n,i,j,f 105 105 int main else if i j else if i j3.母函式 f x...
回文數的判斷 三種方法
最近做了一點關於回文數的總結。首先先寫一篇關於回文數判斷的幾種方法。回文數的概念 即是給定乙個數,這個數順讀和逆讀都是一樣的。例如 121,1221是回文數,123,1231不是回文數。方法一 試用情境,處理小數字。使用數學方法。輸入的回文數x的範圍為x 10 9,int儲存,或者x 10 18,l...