結果
| 問題 |
No.612 Move on grid
|
| コンテスト | |
| ユーザー |
夕叢霧香(ゆうむらきりか)
|
| 提出日時 | 2017-12-12 10:36:57 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,018 ms / 2,500 ms |
| コード長 | 2,268 bytes |
| コンパイル時間 | 752 ms |
| コンパイル使用メモリ | 72,776 KB |
| 実行使用メモリ | 7,432 KB |
| 最終ジャッジ日時 | 2024-12-18 00:48:12 |
| 合計ジャッジ時間 | 9,815 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 17 |
ソースコード
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
typedef long long lint;
typedef vector<int>vi;
typedef pair<int,int>pii;
#define rep(i,n)for(int i=0;i<int(n);++i)
const lint MOD=1000000007;
const int N=2000;
lint fact[N];
lint invfact[N];
static lint powerMod(lint x, lint exponent) {
lint prod = 1;
for (int i = 63; i >= 0; --i) {
prod = (prod * prod) % MOD;
if ((exponent & 1L << i) != 0) {
prod = (prod * x) % MOD;
}
}
return prod;
}
static void initialize() {
fact[0] = invfact[0] = 1;
for (int i = 1; i < N; ++i) {
fact[i] = (i * fact[i - 1]) % MOD;
invfact[i] = powerMod(fact[i], MOD - 2);
}
}
static lint comb(int x, int y) {
if (x < 0) {
return 0;
}
if (y < 0 || y > x) {
return 0;
}
lint r= fact[x] * ((invfact[x - y] * invfact[y]) % MOD) % MOD;
return r;
}
const int T=501;
lint prec[T+1][2*T+2];
int main(){
int t;
cin>>t;
int a[3];
for(int i=0;i<3;++i)cin>>a[i];
int d,e;
cin>>d>>e;
if(a[2]<0){
for(int i=0;i<3;++i)a[i]=-a[i];
int tmp=d;
d=-e;
e=-tmp;
}
initialize();
for(int i=0;i<=t;++i){
for(int z=-t;z<=t;++z){
int az=abs(z);
if((az+i)%2!=0)continue;
int j=(i-z)/2;
prec[i][z+t+1]=j>=0&&j+z>=0?invfact[j]*invfact[j+z]%MOD:0;
}
for(int j=0;j<2*t+1;++j)
prec[i][j+1]=(prec[i][j+1]+prec[i][j])%MOD;
}
long wa=0;
for(int x=-t;x<=t;++x){
int ax=abs(x);
int tx=t-ax;
for(int y=-tx;y<=tx;++y){
int ay=abs(y);
int ty=tx-ay;
int zMin=-ty,zMax=ty;
if(a[2]!=0){
zMin=max(zMin,(d-a[0]*x-a[1]*y+100000*a[2]+a[2]-1)/a[2]-100000);
zMax=min(zMax,(e-a[0]*x-a[1]*y+100000*a[2])/a[2]-100000);
}else if(d-a[0]*x-a[1]*y>0||e-a[0]*x-a[1]*y<0)
continue;
if(zMin>zMax)continue;
//System.err.println("x = "+x+" y = "+y);
//System.err.println("zMin = "+zMin+" zMax = "+zMax);
//System.err.println(Arrays.toString(d2));
long tmp=0;
for(int i=ax+ay;i<=t;i+=2){
long adden=prec[t-i][t+zMax+1]-prec[t-i][t+zMin]+MOD;
adden%=MOD;
long d2=comb(i,(i-ax-ay)/2)*comb(i,(i-ax+ay)/2)%MOD;
d2=d2*invfact[i]%MOD;
adden=adden*d2%MOD;
tmp=(tmp+adden)%MOD;
}
wa=(wa+tmp)%MOD;
}
}
cout<<wa*fact[t]%MOD<<endl;
}
夕叢霧香(ゆうむらきりか)