Submission #249897

#TimeUsernameProblemLanguageResultExecution timeMemory
249897sealnot123Ruins 3 (JOI20_ruins3)C++14
100 / 100
209 ms5376 KiB
#include<bits/stdc++.h> #define x first #define y second #define pb push_back #define eb emplace_back #define all(a) (a).begin(),(a).end() #define SZ(a) (int)(a).size() #define FOR(i, a, b) for(int i=(a); i<=(b); ++i) #define ROF(i, a, b) for(int i=(a); i>=(b); --i) #define make_unique(a) sort(all((a))), (a).resize(unique(all((a)))-(a).begin()) using namespace std; typedef pair<int,int> PII; typedef long long LL; typedef double DD; typedef long double LD; typedef pair<LL,LL> PLL; typedef pair<DD,DD> PDD; typedef vector<int> VI; typedef vector<LL> VL; const int N = 607; const int mod = 1000000007; void plusle(int &a, int b){ if((a+=b) >= mod) a -= mod; } int add(int a, int b){ return ((a+=b)>=mod) ? a-mod : a; } int mul(int a, int b){ return a * 1ll * b % mod; } int dp[N<<1][N]; int comp[N], freestyle[N]; int ranger[N]; int fac[N], inv[N], paskal[N][N]; int place[N][N>>1]; // pillars, sum int power(int a, int b){ int ans = 1; for(int i = 1; i <= b; i<<=1, a=mul(a,a)){ if(i&b) ans = mul(ans, a); } return ans; } void init(){ fac[0] = inv[0] = paskal[0][0] = 1; FOR(i, 1, 600){ fac[i] = mul(fac[i-1], i); inv[i] = power(fac[i], mod-2); paskal[i][0] = 1; FOR(j, 1, i) paskal[i][j] = add(paskal[i-1][j-1], paskal[i-1][j]); } //printf("[[[%d\n",paskal[2][2]); FOR(i, 0, 300) place[0][i] = 1; FOR(i, 1, 600){ FOR(j, 0, 300){ place[i][j] = 0; if(j > 0) place[i][j] = mul( place[i-1][j], i ); if(i > 1) plusle( place[i][j], mul( mul(paskal[i][2], inv[2]), place[i-2][j+1] ) ); if(j > 1) plusle( place[i][j], place[i][j-1] ); } } //printf("place(2,0) %d\n",place[2][0]); comp[1] = 1; FOR(i, 2, 600) comp[i] = place[i][0]; FOR(i, 0, 300) place[0][i] = 1; FOR(i, 1, 600){ FOR(j, 0, 300){ place[i][j] = 0; place[i][j] = mul( place[i-1][j], i ); if(i > 1) plusle( place[i][j], mul( mul(paskal[i][2], inv[2]), place[i-2][j+1] ) ); if(j > 0) plusle( place[i][j], place[i][j-1] ); } } freestyle[0] = 1; FOR(i, 1, 600) freestyle[i] = place[i][0]; //FOR(i, 0, 5){ // printf("comp %d = %d, free %d = %d\n",i,comp[i],i,freestyle[i]); //} FOR(i, 1, 600){ // have i arrange index // make smth FOR(j, 1, i){ // j is number of pillar in the first component int v = mul( paskal[i-1][j-1], comp[j] ); int w = mul( freestyle[i-j], v ); plusle( ranger[i], w ); } //if(i <= 5) printf("[%d] %d\n",i,ranger[i]); } } int mark[N<<1]; void solve(){ int n; init(); scanf("%d",&n); FOR(i,1,n){ int a; scanf("%d",&a); mark[a] = 1; } dp[(n<<1)+1][0] = 1; int Fcnt, Rcnt; Fcnt = Rcnt = 0; ROF(i, n<<1, 1){ if(mark[i]){ FOR(j, 0, Rcnt-Fcnt){ int remain = Rcnt - Fcnt - j; ROF(k, j, 0){ int use = j-k; int v = mul( paskal[j][use], ranger[use+1] ); plusle(dp[i][k], mul( dp[i+1][j], v ) ); } } FOR(j, 0, Rcnt-Fcnt){ plusle( dp[i][j+1], dp[i+1][j] ); } ++Rcnt; }else{ FOR(j, 0, Rcnt-Fcnt-1){ int remain = Rcnt - Fcnt - j; dp[i][j] = mul(dp[i+1][j], remain); } ++Fcnt; } //FOR(j, 0, Rcnt-Fcnt){ // printf("(%d, %d) = %d\n",i,j,dp[i][j]); //} } printf("%d",dp[1][0]); } int main(){ solve(); return 0; } /* * * * * * * * * * * */

Compilation message (stderr)

ruins3.cpp: In function 'void solve()':
ruins3.cpp:110:21: warning: unused variable 'remain' [-Wunused-variable]
                 int remain = Rcnt - Fcnt - j;
                     ^~~~~~
ruins3.cpp:98:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",&n);
     ~~~~~^~~~~~~~~
ruins3.cpp:101:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d",&a);
         ~~~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...