結果

問題 No.474 色塗り2
ユーザー snukesnuke
提出日時 2016-12-18 03:52:53
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 121 ms / 2,000 ms
コード長 1,455 bytes
コンパイル時間 1,381 ms
コンパイル使用メモリ 161,576 KB
実行使用メモリ 36,500 KB
最終ジャッジ日時 2024-05-08 11:00:55
合計ジャッジ時間 2,138 ms
ジャッジサーバーID
(参考情報)
judge3 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 23 ms
36,420 KB
testcase_01 AC 23 ms
36,200 KB
testcase_02 AC 24 ms
36,500 KB
testcase_03 AC 121 ms
36,360 KB
testcase_04 AC 23 ms
36,344 KB
権限があれば一括ダウンロードができます
コンパイルメッセージ
main.cpp: In function ‘int main()’:
main.cpp:45:8: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   45 |   scanf("%d",&ts);
      |   ~~~~~^~~~~~~~~~
main.cpp:55:10: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
   55 |     scanf("%d%d%d",&a,&b,&c);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~

ソースコード

diff #

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0; i < (n); ++i)
#define fi first
#define se second
using namespace std;
typedef long long int ll;

// mod
const int K = 20;
const int mod = 1<<K;
struct mint {
  ll x;
  mint():x(0){}
  mint(ll x):x((x%mod+mod)%mod){}
  mint& operator+=(const mint& a){ if((x+=a.x)>=mod) x-=mod; return *this;}
  mint& operator-=(const mint& a){ if((x+=mod-a.x)>=mod) x-=mod; return *this;}
  mint& operator*=(const mint& a){ (x*=a.x)%=mod; return *this;}
  mint operator+(const mint& a)const{ return mint(*this) += a;}
  mint operator-(const mint& a)const{ return mint(*this) -= a;}
  mint operator*(const mint& a)const{ return mint(*this) *= a;}
};
mint ex(mint a, ll t) {
  if(!t) return 1;
  mint res = ex(a,t/2);
  res *= res;
  return (t&1)?res*a:res;
}
//

typedef pair<mint,int> P;
P p[mod*2];

mint inv(mint a) { return ex(a,mod/2-1);}
mint comb(int a, int b) {
  int c = a-b;
  int two = p[a].se-p[b].se-p[c].se;
  if (two >= K) return 0;
  mint res = p[a].fi*inv(p[b].fi)*inv(p[c].fi);
  res *= 1<<two;
  return res;
}

int main() {
  int ts;
  scanf("%d",&ts);
  p[0] = P(1,0);
  rep(i,mod*2) if (i) {
    p[i] = p[i-1];
    int x = i;
    while (x%2 == 0) p[i].se++, x >>= 1;
    p[i].fi *= x;
  }
  rep(ti,ts) {
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);
    // C(C(c+b-1,b)*c+a-1,a)*c
    mint x = comb(c+b-1,b)*c;
    mint y = comb((x+a-1).x+mod,a)*c;
    printf("%lld\n", y.x&1);
  }
  return 0;
}
0