結果
問題 | No.2181 LRM Question 2 |
ユーザー |
|
提出日時 | 2023-01-06 23:31:11 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 54 ms / 2,000 ms |
コード長 | 1,430 bytes |
コンパイル時間 | 974 ms |
コンパイル使用メモリ | 85,544 KB |
実行使用メモリ | 7,680 KB |
最終ジャッジ日時 | 2024-11-30 20:25:56 |
合計ジャッジ時間 | 2,310 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 23 |
ソースコード
#include<iostream>#include<vector>#include<atcoder/math>#include<atcoder/modint>using namespace std;using mint=atcoder::modint;int P;struct val{long e;mint v;val(long n){e=0;while(n%P==0)n/=P,e++;v=n;}};//v*p**emint F[1<<20];val f(long N){val ret(1);int PP=mint::mod();while(N>=1){long q=N/P;ret.v*=F[PP-1].pow(N/PP)*F[N%PP];ret.e+=N=q;}return ret;}val mul(val a,val b){a.e+=b.e;a.v*=b.v;return a;}int main(){long L,R;int M;cin>>L>>R>>M;vector<pair<int,int> >fac;{int m=M;for(int i=2;i*i<=m;i++)if(m%i==0){fac.push_back(make_pair(i,0));while(m%i==0)m/=i,fac.back().second++;}if(m>1)fac.push_back(make_pair(m,1));}vector<long long>r,m;for(pair<int,int>fp:fac){P=fp.first;int mod=1;for(int i=0;i<fp.second;i++)mod*=P;mint::set_mod(mod);m.push_back(mod);F[0]=1;for(int i=1;i<mod;i++){F[i]=F[i-1];if(i%P!=0)F[i]*=i;}int now=0;val x=f(2*L),y=f(L);for(long n=L;n<=R;n++){if(n>L){//x <- 2*n-1,2*n//y <- nx=mul(mul(x,2*n-1),2*n);y=mul(y,n);}assert(x.e-y.e*2>=0);if(x.e-y.e*2>=fp.second)continue;int tmp=(x.v/y.v.pow(2)).val();for(int i=0;i<x.e-y.e*2;i++)tmp=(long)tmp*P%mod;now=(now+tmp)%mod;}r.push_back(now);}pair<long long,long long>ret=atcoder::crt(r,m);assert(ret.second==M);cout<<(ret.first-(R-L+1)*2%M+M)%M<<endl;}