Submission #1176570

#TimeUsernameProblemLanguageResultExecution timeMemory
1176570StefanSebezTents (JOI18_tents)C++20
100 / 100
327 ms73328 KiB
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define pb push_back #define ll long long #define ld long double const int mod=1e9+7,N=3050; ll Plus(ll a,ll b){while(a<0)a+=mod;while(b<0)b+=mod;a%=mod;b%=mod;return (a+b)%mod;} ll Puta(ll a,ll b){while(a<0)a+=mod;while(b<0)b+=mod;a%=mod;b%=mod;return (a*b)%mod;} ll dp[N+50][N+50]; string S="-NESW"; ll Bruteforce(int n,int m){ int a[n+1][m+1]; int e=1;for(int i=1;i<=n*m;i++) e*=5; ll res=0; for(int mask=0;mask<e;mask++){ int temp=mask; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++,temp/=5){ a[i][j]=temp%5; } } bool moze=true; for(int i=1;i<=n;i++){ vector<int>ind; for(int j=1;j<=m;j++){ if(a[i][j]) ind.pb(j); } if(ind.size()>2) moze=false; else if(ind.size()==2){ if(!(a[i][ind[0]]==2&&a[i][ind[1]]==4)) moze=false; } } for(int j=1;j<=m;j++){ vector<int>ind; for(int i=1;i<=n;i++){ if(a[i][j]) ind.pb(i); } if(ind.size()>2) moze=false; else if(ind.size()==2){ if(!(a[ind[0]][j]==1&&a[ind[1]][j]==3)) moze=false; } } if(moze){ res++; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cout<<S[a[i][j]]; } cout<<endl; } cout<<endl; } } return res; } int main(){ int n,m;scanf("%i%i",&n,&m); for(int i=0;i<=N;i++) dp[i][0]=dp[0][i]=1; /*for(ll i=1;i<=n;i++){ for(ll j=1;j<=m;j++){ dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]; dp[i][j]+=4*dp[i-1][j-1]; if(i>=2)dp[i][j]+=(i-1)*dp[i-2][j-1]; if(j>=2)dp[i][j]+=(j-1)*dp[i-1][j-2]; if(i>=2&&j>=2)dp[i][j]+=4*(i-1)*4*(j-1)*dp[i-2][j-2]; if(i>=2&&j>=3)dp[i][j]+=4*(i-1)*(((j-1)*(j-2))/2)*dp[i-2][j-3]; if(i>=3&&j>=2)dp[i][j]+=(((i-1)*(i-2))/2)*4*(j-1)*dp[i-3][j-2]; if(i>=3&&j>=3)dp[i][j]+=((((i-1)*(i-2))/2)*(((j-1)*(j-2))/2))*dp[i-3][j-3]; if(i>=2&&j>=3)dp[i][j]+=(i-1)*(j-2)*4*(j-1)*dp[i-2][j-3]; if(i>=3&&j>=2)dp[i][j]+=4*(i-1)*(j-1)*(i-2)*dp[i-3][j-2]; if(i>=3&&j>=3)dp[i][j]+=(i-1)*(j-2)*(j-1)*(i-2)*dp[i-3][j-3]; if(i>=2&&j>=4)dp[i][j]+=(i-1)*(j-1)*((j-2)*(j-3))/2*dp[i-2][j-4]; if(i>=4&&j>=2)dp[i][j]+=(i-1)*(j-1)*((i-2)*(i-3))/2*dp[i-4][j-2]; dp[i][j]%=mod; } }*/ for(ll i=1;i<=n;i++){ for(ll j=1;j<=m;j++){ dp[i][j]=Plus(Plus(dp[i-1][j],dp[i][j-1]),3*dp[i-1][j-1]); if(i>=2)dp[i][j]+=Puta(i-1,dp[i-2][j-1]); if(j>=2)dp[i][j]+=Puta(j-1,dp[i-1][j-2]); if(i>=2&&j>=2)dp[i][j]+=Puta(Puta(4*(i-1),4*(j-1)),dp[i-2][j-2]); if(i>=2&&j>=3)dp[i][j]+=Puta(Puta(4*(i-1),((j-1)*(j-2))/2),dp[i-2][j-3]); if(i>=3&&j>=2)dp[i][j]+=Puta(Puta(((i-1)*(i-2))/2,4*(j-1)),dp[i-3][j-2]); if(i>=3&&j>=3)dp[i][j]+=Puta(Puta(((i-1)*(i-2))/2,((j-1)*(j-2))/2),dp[i-3][j-3]); if(i>=2&&j>=3)dp[i][j]+=Puta(Puta((i-1)*(j-2),4*(j-1)),dp[i-2][j-3]); if(i>=3&&j>=2)dp[i][j]+=Puta(Puta(4*(i-1),(j-1)*(i-2)),dp[i-3][j-2]); if(i>=3&&j>=3)dp[i][j]+=Puta(Puta((i-1)*(j-2),(j-1)*(i-2)),dp[i-3][j-3]); if(i>=2&&j>=4)dp[i][j]+=Puta(Puta((i-1)*(j-1),((j-2)*(j-3))/2),dp[i-2][j-4]); if(i>=4&&j>=2)dp[i][j]+=Puta(Puta((i-1)*(j-1),((i-2)*(i-3))/2),dp[i-4][j-2]); dp[i][j]%=mod; } } //cout<<Bruteforce(n,m)<<endl; /*for(int i=0;i<=n;i++){ for(int j=0;j<=m;j++){ printf("%i %i: %lld\n",i,j,dp[i][j]); } }*/ printf("%lld\n",dp[n][m]-1); return 0; }

Compilation message (stderr)

tents.cpp: In function 'int main()':
tents.cpp:59:18: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |     int n,m;scanf("%i%i",&n,&m);
      |             ~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...