NAIPC2016 F (計數dp)
阿新 • • 發佈:2018-12-13
dp好弱鴨
#include<iostream> #include<cstring> #define mod 1000000007 typedef long long ll; using namespace std; ll dp[110][10010]; int main(){ ll n,w,h; cin>>n>>w>>h; memset(dp,0,sizeof(dp)); dp[0][0]=1; for(int i=1;i<=w;i++){ for(int j=0;j<=n;j++){ for(int k=0;k<=h;k++){ if(j+k>n)break; dp[i][j+k]=dp[i][j+k]+dp[i-1][j]; if(dp[i][j+k]>mod) dp[i][j+k]-=mod; } } } // for(ll i=1;i<=w;i++){ // for(ll j=1;j<=n;j++) // cout<<i<<" "<<j<<" "<<dp[i][j]<<endl; // } ll sum=0; for(int i=0;i<=n;i++){ sum+=dp[w][i]; if(sum>mod) sum-=mod; } // sum-=n/w+1; if(n>w*h) sum-=h+1; else sum-=n/w+1; while(sum<=0){ sum+=mod; }sum%=mod; cout<<sum<<endl; }