LOJ#2954. 「NOIP2018」填数游戏 打表+搜索
1 ~ 6 的都跑完了,7 的还没跑出来.
code1:
#include <bits/stdc++.h>
#define ll long long
#define mod 998244353
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int a[10][10],n,m,ans,flag;
ll maxx;
int solve(int x,int y,ll cur)
{
if(x==n&&y==m)
{
if(maxx==-1)
maxx=cur;
else if(maxx>cur) { flag=1; return 0; }
else maxx=max(maxx,cur);
return 1;
}
int cu=1;
if(y<m) cu&=solve(x,y+1,cur*10+a[x][y+1]);
if(!cu) return 0;
if(x<n) cu&=solve(x+1,y,cur*10+a[x+1][y]);
return cu;
}
void cal()
{
maxx=-1,flag=0;
solve(1,1,a[1][1]);
ans+=(!flag);
// if(!flag) printf("%d\n",ans);
}
void dfs(int x,int y)
{
for(int i=0;i<2;++i)
{
if(x-1>=1&&y+1<=m&&a[x-1][y+1]>i) continue;
a[x][y]=i;
if(x==n&&y==m) cal();
else if(y==m) dfs(x+1,1);
else dfs(x,y+1);
}
}
int main()
{
setIO("input");
// freopen("input.out","w",stdout);
scanf("%d%d",&n,&m);
dfs(1,1);
printf("%d\n",ans);
return 0;
}
code2:
#include <bits/stdc++.h>
#define ll long long
#define mod 1000000007
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n,m;
ll qpow(int x,int y)
{
ll tmp=1;
for(;y;y>>=1,x=(ll)x*x%mod) if(y&1) tmp=(ll)tmp*x%mod;
return tmp;
}
void calc3()
{
return;
}
int main()
{
// setIO("input");
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
scanf("%d%d",&n,&m);
if(n==1) printf("%lld\n",qpow(2,m));
else if(n==2) printf("%lld\n",4ll*qpow(3,m-1)%mod);
else if(n==3)
{
if(m==1) printf("%d\n",8);
else if(m==2) printf("%d\n",36);
else if(m==3) printf("%d\n",112);
else printf("%lld\n",1ll*112*qpow(3,m-3)%mod);
}
else if(n==4)
{
if(m==1) printf("16\n");
else if(m==2) printf("108\n");
else if(m==3) printf("336\n");
else if(m==4) printf("912\n");
else if(m==5) printf("2688\n");
else if(m==6) printf("8064\n");
else printf("%lld\n",1ll*8064*qpow(3,m-6)%mod);
}
else if(n==5)
{
if(m==1) printf("32\n");
else if(m==2) printf("324\n");
else if(m==3) printf("1008\n");
else if(m==4) printf("2688\n");
else if(m==5) printf("7136\n");
else if(m==6) printf("21312\n");
else printf("%lld\n",1ll*21312*qpow(3,m-6)%mod);
}
else if(n==6)
{
if(m==1) printf("64\n");
else if(m==2) printf("972\n");
else if(m==3) printf("3024\n");
else if(m==4) printf("8064\n");
else if(m==5) printf("21312\n");
else if(m==6) printf("56768\n");
else if(m==7) printf("170112\n");
else if(m==8) printf("510336\n");
else printf("%lld\n",1ll*510336*qpow(3,m-8)%mod);
}
else if(n==7)
{
}
return 0;
}
7:
128
2916
9072
24192
63936
170112
453504

浙公网安备 33010602011771号