結果

問題 No.612 Move on grid
ユーザー 夕叢霧香(ゆうむらきりか)夕叢霧香(ゆうむらきりか)
提出日時 2017-12-12 10:35:55
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
TLE  
実行時間 -
コード長 2,281 bytes
コンパイル時間 850 ms
コンパイル使用メモリ 73,616 KB
実行使用メモリ 14,016 KB
最終ジャッジ日時 2024-05-08 04:26:16
合計ジャッジ時間 5,048 ms
ジャッジサーバーID
(参考情報)
judge4 / judge3
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 2 ms
13,760 KB
testcase_01 AC 3 ms
6,940 KB
testcase_02 AC 2 ms
6,940 KB
testcase_03 AC 466 ms
6,940 KB
testcase_04 TLE -
testcase_05 -- -
testcase_06 -- -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

#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] * powerMod((fact[x - y] * fact[y]) % MOD, MOD - 2)) % 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;
}
0