# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
100269 | ami | Mobitel (COCI19_mobitel) | C++14 | 2275 ms | 10588 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define sz(c) int(c.size())
#define rep(i,a,b) for (int i=a; i<(b); ++i)
#define per(i,a,b) for (int i=(b)-1; i>=(a); --i)
using namespace std;
using ll = long long;
const int MD=int(1e9)+7;
void madd(int &x,int y) {
x+=y;
if (x>=MD) x-=MD;
}
int const MAXR=330;
int const MAXN=1100000;
int const MAXK=2200;
int R,C,N;
ll a[MAXR][MAXR];
int ord[MAXN];
ll smallest[MAXN];
int f[2][MAXR][MAXK];
inline int get_ord(ll x) {
if (x<N) return ord[x]; else return ord[N];
}
int main() {
cin.tie(0);
ios_base::sync_with_stdio(0);
cout<<fixed<<setprecision(10);
cin>>R>>C>>N;
rep(i,0,R) rep(j,0,C) cin>>a[i][j];
rep(i,1,N+1) {
ord[i]=ord[i-1];
if (i==1 || ((N+i-1)/i != (N+i-2)/(i-1))) {
ord[i]++;
smallest[ord[i]]=i;
}
}
int K=ord[N];
rep(i,0,C) rep(j,1,K+1) f[0][i][j]=0;
f[0][0][get_ord(a[0][0])]=1;
rep(i,0,R) {
int cur=i%2;
int nxt=!cur;
rep(j,0,C) rep(k,1,K+1) f[nxt][j][k]=0;
rep(j,0,C) rep(k,1,K+1) if (f[cur][j][k]) {
if (j+1<C) {
int nk=get_ord(smallest[k]*a[i][j+1]);
madd(f[cur][j+1][nk],f[cur][j][k]);
}
if (i+1<R) {
int nk=get_ord(smallest[k]*a[i+1][j]);
madd(f[nxt][j][nk],f[cur][j][k]);
}
}
}
cout<<f[(R-1)%2][C-1][K]<<"\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |