题解:AT_abc402_f [ABC402F] Path to Integer
_qumingnan_ · · 题解
题目跳楼机
正文开始
阅读理解
有一个
思路
可以看到,
既然
那现在问题就变成了如何将这两个答案进行整合。
首先,我们可以发现一个明显的性质:位置为
统计答案时,很明显需要两个图(设第一个图答案为
于是在排序后,由于
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m;
int b[405];
int ans;
int d[25][25];
int a[25][25];
int c[3][25][1000006],cnt[25][1000006];
inline void dfs(int i,int x,int y,int s){
if(x+y==n+1){
if(i)s=(s+a[x][y])%m;
c[i][x][++cnt[i][x]]=s;return ;
}
s=(s+a[x][y])%m;
if(i){
dfs(i,x-1,y,s);
dfs(i,x,y-1,s);
}
else {
dfs(i,x+1,y,s);
dfs(i,x,y+1,s);
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
int N=2*n-1;b[1]=1;
for(int i=2;i<=N;i++)b[i]=(b[i-1]*10)%m;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>d[i][j],a[i][j]=((d[i][j]%m)*(b[N-i-j+2]%m))%m;
dfs(0,1,1,0);//从(1,1)开始
dfs(1,n,n,0);//从(n,n)开始
for(int i=1;i<=n;i++){
sort(c[0][i]+1,c[0][i]+cnt[0][i]+1);
sort(c[1][i]+1,c[1][i]+cnt[1][i]+1);
}
for(int i=1;i<=n;i++){
int k=cnt[1][i];
for(int j=1;j<=cnt[0][i];j++){
ans=max(ans,(c[0][i][j]+c[1][i][cnt[1][i]])%m);
for(;k;k--)
if(c[0][i][j]+c[1][i][k]<m)break;
if(!k)continue;
ans=max(ans,(c[0][i][j]+c[1][i][k])%m);
}
}
int s=ans;
cout<<s;
return 0;
}