标签:nod i++ ++ using output 相加 集合 scan define
整数划分
输入1个数N(1 <= N <= 50000)。
输出划分的数量Mod 10^9 + 7。
6
4
【分析】注意到划分后,每个集合里数的个数不超多350个,然后考虑dp[i][j]表示将数字i化成j个数相加,
然后将这j个数每个数+1,即可得到数字i+j,若将这j个数+1,在添加一个 “1”,即可得到i+j+1。
#include <bits/stdc++.h> #define inf 0x3f3f3f3f #define met(a,b) memset(a,b,sizeof a) #define pb push_back #define mp make_pair #define rep(i,l,r) for(int i=(l);i<=(r);++i) #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int N =5e4 + 50;; const int M = 17; const int mod = 1e9+7; const int mo=123; const double pi= acos(-1.0); typedef pair<int,int>pii; int n; int dp[N][350]; int main(){ scanf("%d",&n); dp[1][1]=1; for(int i=1; i<350; i++){ for(int j=1; j<=n; j++){ if(i+j<=n)dp[i+j][i]=(dp[i+j][i]+dp[j][i])%mod; if(i+j+1<=n&&i+1<350)dp[i+j+1][i+1]=(dp[i+j+1][i+1]+dp[j][i])%mod; } } int ans=0; for(int i=1; i<350; i++)ans=(ans+dp[n][i])%mod; cout<<ans<<endl; return 0; }
标签:nod i++ ++ using output 相加 集合 scan define
原文地址:http://www.cnblogs.com/jianrenfang/p/7380352.html