結果
| 問題 | 
                            No.269 見栄っ張りの募金活動
                             | 
                    
| コンテスト | |
| ユーザー | 
                             土井洋平
                         | 
                    
| 提出日時 | 2020-06-04 18:59:11 | 
| 言語 | C++14  (gcc 13.3.0 + boost 1.87.0)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 10 ms / 5,000 ms | 
| コード長 | 907 bytes | 
| コンパイル時間 | 1,542 ms | 
| コンパイル使用メモリ | 166,688 KB | 
| 実行使用メモリ | 19,076 KB | 
| 最終ジャッジ日時 | 2024-11-29 20:46:43 | 
| 合計ジャッジ時間 | 2,503 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge3 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 22 | 
ソースコード
#include <bits/stdc++.h>
#define rep(i,n) for(ll i=0;i<(n);i++)
typedef long long ll;
using namespace std;
typedef pair<ll, ll> P;
ll const mod = 1000000007;
int main(){
    /*
    a1+K≤a2,a1+2K≤a3,⋯,a1+NK≤an
    ここでbi = ai - ikとすると, b1<= b2 <= b3...となる。
    s= a1 + a2 .. anの条件式に代入すると
    b1 + b2 .. bn = s - (k + 2k + ...nk)= s - n(n-1)k/2 となる。あとは分割法
    */
    int n, s, k;
    cin >> n >> s >> k;
    s -= n*(n-1)*k/2;
    if(s<0){
        cout << 0 << endl;
        return 0;
    }
    //dp[i][j] jのi分割
    ll dp[n+1][s+1] = {};
    dp[0][0] = 1;
    for(int i=1;i<=n;i++)rep(j,s+1){
        if(j-i>=0){
            dp[i][j] = ((dp[i][j-i] + dp[i-1][j]) % mod);
        }
        else{//iの方が大きいと分割できない
            dp[i][j] = dp[i-1][j] % mod;
        }
    }
    
    cout << dp[n][s] << endl;
}
            
            
            
        
            
土井洋平