結果
| 問題 |
No.2613 Sum of Combination
|
| コンテスト | |
| ユーザー |
蜜蜂
|
| 提出日時 | 2021-03-05 17:59:28 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 2,312 bytes |
| コンパイル時間 | 4,172 ms |
| コンパイル使用メモリ | 241,652 KB |
| 実行使用メモリ | 30,036 KB |
| 最終ジャッジ日時 | 2024-09-28 03:46:14 |
| 合計ジャッジ時間 | 11,421 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 3 |
| other | AC * 3 WA * 46 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#include <atcoder/all>
using namespace atcoder;
using ll = long long;
using ld = long double;
#define fi first
#define se second
#define pb push_back
const int MAX=510000;
ll MOD;
ll fac[MAX],finv[MAX],inv[MAX];
void COMinit(){
fac[0]=fac[1]=1;
finv[0]=finv[1]=1;
inv[1]=1;
for(int i=2;i<MAX;i++){
fac[i]=fac[i-1]*i%MOD;
inv[i]=MOD-inv[MOD%i]*(MOD/i)%MOD;
finv[i]=finv[i-1]*inv[i]%MOD;
}
}
ll COM(int n,int k){
if(n<k) return 0;
if(n<0||k<0) return 0;
return fac[n]*(finv[k]*finv[n-k]%MOD)%MOD;
}
constexpr ll mod = 998244353;
random_device seed;
mt19937_64 randint(seed());
ll ggr(ll mi,ll ma) { // [mi, ma)
return mi + randint() % (ma - mi);
}
int main(){
ll n;
int p;
cin>>n>>p;
int copyp=p;
MOD=p;
COMinit();
vector<int> v;
while(n>0){
v.pb(n%p);
n/=p;
}
if(p==2){
ll ans=1;
for(int i:v){
if(i==1){
ans*=2;
ans%=mod;
}
}
cout<<ans<<endl;
return 0;
}
vector<int> divisor;
p--;
for(int i=2;i*i<=p;i++){
if(p%i==0){
divisor.pb(i);
while(p%i==0){
p/=i;
}
}
}
if(p>1){
divisor.pb(p);
}
p=copyp;
int root;
while(true){
int check=ggr(2,p);
int flag=1;
for(int i:divisor){
if(pow_mod(check,(p-1)/i,p)==1){
flag=0;
break;
}
}
if(flag==1){
root=check;
break;
}
if(p==2){
root=1;
break;
}
}
cout<<root<<endl;
vector<ll> powmod(p),invpowmod(p);
//powmod[i] := root^i (mod p)
//invpowmod[i] := root^(invpowmod[i]) = i (mod p)
powmod[0]=1;
for(int i=1;i<p;i++){
powmod[i]=powmod[i-1]*root;
powmod[i]%=p;
invpowmod[powmod[i]]=i;
}
invpowmod[0]=-1;
invpowmod[1]=0;
vector<ll> a(p,0);
a[0]=1;
cout<<v.size()<<endl;
for(int now:v){
cout<<now<<endl;
vector<ll> b(p,0);
for(int i=0;i<=now;i++){
int next=COM(now,i);
if(next==0){
continue;
}
b[invpowmod[next]]++;
}
vector<ll> c=convolution(a,b);
for(int i=0;i<p;i++){
a[i]=0;
}
for(int i=0;i<2*p-1;i++){
a[i%(p-1)]+=c[i];
}
}
ll ans=0;
for(int i=0;i<p;i++){
ans+=powmod[i]*a[i];
ans%=mod;
}
cout<<ans<<endl;
}
蜜蜂