結果
問題 | No.1581 Multiple Sequence |
ユーザー | shiomusubi496 |
提出日時 | 2021-07-02 22:26:09 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 655 ms / 2,000 ms |
コード長 | 876 bytes |
コンパイル時間 | 2,173 ms |
コンパイル使用メモリ | 207,868 KB |
最終ジャッジ日時 | 2025-01-22 16:20:12 |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 |
ソースコード
#include<bits/stdc++.h> #define int long long using namespace std; constexpr int mod=1000000007; signed main(){ int M; cin>>M; vector<vector<int>> Y(M+1); for(int i=1;i<=M;i++){ for(int j=i;j<=M;j+=i)Y[j].push_back(i); } Y[0]=vector<int>(M); for(int i=0;i<M;i++)Y[0][i]=i+1; reverse(Y.begin(),Y.end()); vector<map<int,int>>Z(M+1); for(int i=0;i<=M;i++){ for(int j=0;j<Y[i].size();j++)Z[i][Y[i][j]]=j; } vector<vector<int>> dp(M+1); for(int i=0;i<=M;i++)dp[i].resize(Y[i].size()); dp[0][0]=1; for(int i=0;i<M;i++){ int K=Y[i].size(); for(int j=K-1;j>=0;j--){ for(int k:Y[M-Y[i][j]]){ if(Y[i][j]!=k)(dp[i][j]+=dp[i][Z[i][k]])%=mod; } } for(int j=0;j<K;j++){ (dp[i+Y[i][j]][Z[i+Y[i][j]][Y[i][j]]]+=dp[i][j])%=mod; } } int ans=0; for(int i=0;i<M;i++)(ans+=dp[M][i])%=mod; cout<<ans<<endl; }