結果
| 問題 |
No.916 Encounter On A Tree
|
| コンテスト | |
| ユーザー |
otamay6
|
| 提出日時 | 2019-10-25 22:38:22 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,855 bytes |
| コンパイル時間 | 1,618 ms |
| コンパイル使用メモリ | 172,120 KB |
| 実行使用メモリ | 21,504 KB |
| 最終ジャッジ日時 | 2024-09-13 04:57:02 |
| 合計ジャッジ時間 | 3,648 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 5 |
| other | AC * 53 WA * 3 |
コンパイルメッセージ
main.cpp: In function 'int main()':
main.cpp:56:13: warning: 'Rd' may be used uninitialized [-Wmaybe-uninitialized]
56 | ll p=(Ld+Rd-k);
| ~~^~~
main.cpp:49:11: note: 'Rd' was declared here
49 | ll Ld,Rd;
| ^~
main.cpp:67:9: warning: 'Ld' may be used uninitialized [-Wmaybe-uninitialized]
67 | if(i==Ld){
| ^~
main.cpp:49:8: note: 'Ld' was declared here
49 | ll Ld,Rd;
| ^~
ソースコード
#include<bits/stdc++.h>
#define REP(i,n) for(int i=0,i##_len=(n);i<i##_len;++i)
#define rep(i,a,b) for(int i=int(a);i<int(b);++i)
#define All(x) (x).begin(),(x).end()
using namespace std;
typedef long long ll;
constexpr ll mod=1e9+7;
ll mpow(ll x, ll n){
ll ans = 1; x%=mod;
while(n != 0){
if(n&1) ans = ans*x % mod;
x = x*x % mod;
n = n >> 1;
}
return ans;
}
ll inv_mod(ll a){return mpow(a,mod-2);}
class Factorial{//階乗とその逆元を求めて計算に利用するクラス
private:
vector<ll> fac;
vector<ll> ifac;
public:
Factorial(ll N){
fac.push_back(1);
REP(i,N) fac.push_back(fac[i]*(i+1)%mod);
ifac.resize(N+1);
ifac[N]=inv_mod(fac[N]);
REP(i,N) ifac[N-1-i]=(ifac[N-i]*(N-i))%mod;
}
ll fact(ll a){return fac[a];}
ll ifact(ll a){return ifac[a];}
ll cmb(ll a,ll b){
if(a==0&&b==0) return 1;
if(a<b||a<0||b<0) return 0;
ll tmp =ifact(a-b)*ifact(b)%mod;
return tmp*fac[a]%mod;
}
ll per(ll a,ll b){
if(a==0&&b==0) return 1;
if(a<b||a<0||b<0) return 0;
return fac[a]*ifac[a-b]%mod;
}
};
int main(){
ll d,l,r,k;cin>>d>>l>>r>>k;
ll Ld,Rd;
ll tmp=1;
REP(i,d){
if(tmp<=l&&l<2*tmp) Ld=i;
if(tmp<=r&&r<2*tmp) Rd=i;
tmp*=2;
}
ll p=(Ld+Rd-k);
if(p&1||p<0||d<=p/2){
cout<<0<<endl;
return 0;
}
p/=2;
Factorial get(tmp);
ll ans=1;
ll v=1;
REP(i,d){
ll cnt=0;
if(i==Ld){
ans*=v;
ans%=mod;
cnt++;
}
if(i==Rd){
ans*=mpow(2,Rd-p-1);
if(p==Ld) ans*=2;
ans%=mod;
cnt++;
}
ans*=get.fact(v-cnt);
ans%=mod;
v*=2;
}
cout<<ans<<endl;
}
otamay6