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...