結果
問題 | 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;}