Submission #1112848

#TimeUsernameProblemLanguageResultExecution timeMemory
1112848ezzzayZapina (COCI20_zapina)C++14
110 / 110
240 ms2376 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define ff first #define ss second #define pb push_back const int N=355; int dp[N][N][2]; const int mod=1e9+7; int arr[N]; int mult[N*N*10]; int modd(int a){ return((a%mod+mod)%mod); } int fun(int a, int b){ int ans=1; for(int i=0;i<=31;i++){ if(b&(1<<i)){ ans=modd((ans*a)); } a=modd(a*a); } return ans; } int find(int a, int b){ if(a==b)return 1; if(b>a)return 1; return modd(modd(arr[a]*mult[a-b])*mult[b]); } signed main(){ arr[0]=1; for(int i=1;i<N;i++){ arr[i]=arr[i-1]*i%mod; } for(int i=0;i<N;i++){ mult[i]=fun(arr[i],mod-2); } int n; cin>>n; dp[0][0][0]=1; for(int i=1;i<=n;i++){ for(int j=0;j<=n;j++){ for(int k=0;k<=n;k++){ if(j+k>n)break; if(k==i){ dp[i][j+k][1]+=(dp[i-1][j][1]+dp[i-1][j][0])*find(n-j,k); } else{ dp[i][j+k][1]+=dp[i-1][j][1]*find(n-j,k); dp[i][j+k][0]+=dp[i-1][j][0]*find(n-j,k); } dp[i][j+k][1]%=mod; dp[i][j+k][0]%=mod; } } } cout<<dp[n][n][1]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...