結果
問題 | No.1258 コインゲーム |
ユーザー | たたき@競プロ |
提出日時 | 2023-09-09 19:48:44 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 300 ms / 2,000 ms |
コード長 | 865 bytes |
コンパイル時間 | 5,463 ms |
コンパイル使用メモリ | 310,236 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-06-27 12:24:30 |
合計ジャッジ時間 | 18,434 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 50 |
ソースコード
#include<bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using mint=modint1000000007; using ll=long long; using pp=pair<mint,mint>; #define sr string #define vc vector #define fi first #define se second #define rep(i,n) for(ll i=0;i<(ll)n;i++) #define pb push_back #define all(v) v.begin(),v.end() #define pque priority_queue #define bpc(a) __builtin_popcount(a) int main(){ ll t;cin>>t; rep(z,t){ ll n,m,x;cin>>n>>m>>x; auto merge=[&](pp a,pp b)->pp{ return {a.fi*b.fi+a.se*b.se,a.fi*b.se+a.se*b.fi}; }; pp e={1,m}; auto f=[&](auto f,ll a)->pair<mint,mint>{ if(a==1)return e; auto res=f(f,a/2); res=merge(res,res); if(a&1)res=merge(res,e); return res; }; pp res=f(f,n); if(x==0)cout<<res.fi.val(); else cout<<res.se.val(); cout<<"\n"; } }