QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#420715 | #8715. 放苹果 | Kevin5307 | AC ✓ | 1819ms | 68684kb | C++23 | 4.2kb | 2024-05-24 21:26:26 | 2024-05-24 21:26:27 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
namespace Polynomial
{
using ll=long long;
using poly=vector<ll>;
const ll mod=998244353;
ll ksm(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans=ans*a%mod;
b>>=1;
a=a*a%mod;
}
return ans;
}
inline int sz(const poly &p)
{
return p.size();
}
const poly operator +(const poly &a,const poly &b)
{
int p=sz(a),q=sz(b);
int n=max(p,q);
poly ret(n,0);
for(int i=0;i<n;i++)
{
if(i<p) ret[i]+=a[i];
if(i<q) ret[i]+=b[i];
if(ret[i]>=mod) ret[i]-=mod;
}
return ret;
}
const poly operator -(const poly &a,const poly &b)
{
int p=sz(a),q=sz(b);
int n=max(p,q);
poly ret(n,0);
for(int i=0;i<n;i++)
{
if(i<p) ret[i]+=a[i];
if(i<q) ret[i]+=mod-b[i];
if(ret[i]>=mod) ret[i]-=mod;
}
return ret;
}
poly operator *(poly a,poly b)
{
const ll g=3;
int len=sz(a)+sz(b);
int m=1;
while(m<sz(a)+sz(b)) m*=2;
a.resize(m);
b.resize(m);
vector<int> rev(m);
for(int i=0;i<m;i++)
rev[i]=(rev[i>>1]>>1)|((i&1)*(m>>1));
for(int i=0;i<m;i++)
if(rev[i]<i)
{
swap(a[i],a[rev[i]]);
swap(b[i],b[rev[i]]);
}
for(int i=1;i<m;i<<=1)
{
ll gn=ksm(g,(mod-1)/i/2);
for(int j=0;j<m;j+=(i<<1))
{
ll g0=1;
for(int k=0;k<i;k++,g0=g0*gn%mod)
{
{
ll x=a[j+k],y=g0*a[i+j+k]%mod;
a[j+k]=(x+y)%mod;
a[i+j+k]=(x+mod-y)%mod;
}
{
ll x=b[j+k],y=g0*b[i+j+k]%mod;
b[j+k]=(x+y)%mod;
b[i+j+k]=(x+mod-y)%mod;
}
}
}
}
for(int i=0;i<m;i++)
a[i]=a[i]*b[i]%mod;
for(int i=0;i<m;i++)
if(rev[i]<i)
swap(a[i],a[rev[i]]);
for(int i=1;i<m;i<<=1)
{
ll gn=ksm(g,(mod-1)/i/2*(mod-2));
for(int j=0;j<m;j+=(i<<1))
{
ll g0=1;
for(int k=0;k<i;k++,g0=g0*gn%mod)
{
ll x=a[j+k],y=g0*a[i+j+k]%mod;
a[j+k]=(x+y)%mod;
a[i+j+k]=(x+mod-y)%mod;
}
}
}
ll val=ksm(m,mod-2);
for(int i=0;i<m;i++)
a[i]=a[i]*val%mod;
a.resize(len-1);
return a;
}
poly inv(poly p,int deg)
{
p.resize(deg);
if(deg==1) return {ksm(p[0],mod-2)};
poly w=inv(p,(deg+1)/2);
poly g=w+w-p*w*w;
g.resize(deg);
return g;
}
poly deriv(poly p)
{
for(int i=0;i<sz(p);i++)
p[i]=p[i]*i%mod;
p.erase(p.begin());
return p;
}
poly integ(poly p)
{
p.insert(p.begin(),0);
for(int i=0;i<sz(p);i++)
p[i]=p[i]*ksm(i,mod-2)%mod;
return p;
}
poly ln(poly p)
{
return integ(deriv(p)*inv(p,sz(p)));
}
poly exp(poly p,int deg)
{
p.resize(deg);
if(deg==1)
return {1};
poly g=exp(p,(deg+1)/2);
g=g*(poly{1}-ln(g)+p);
g.resize(deg);
return g;
}
const poly operator %(poly a,poly b)
{
if(sz(a)<sz(b)) return a;
int n=sz(a),m=sz(b);
int d=n-m+1;
poly a2=a,b2=b;
reverse(a2.begin(),a2.end());
reverse(b2.begin(),b2.end());
a2.resize(d);
b2.resize(d);
poly q=a2*inv(b2,d);
q.resize(d);
reverse(q.begin(),q.end());
q=a-b*q;
q.resize(m-1);
return q;
}
const poly operator /(poly a,poly b)
{
if(sz(a)<sz(b)) return a;
int n=sz(a),m=sz(b);
int d=n-m+1;
poly a2=a,b2=b;
reverse(a2.begin(),a2.end());
reverse(b2.begin(),b2.end());
a2.resize(d);
b2.resize(d);
poly q=a2*inv(b2,d);
q.resize(d);
reverse(q.begin(),q.end());
return q;
}
}
using namespace Polynomial;
ll fact[200200],rfact[200200];
ll S[200200];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
fact[0]=1;
for(int i=1;i<200200;i++)
fact[i]=fact[i-1]*i%mod;
for(int i=0;i<200200;i++)
rfact[i]=ksm(fact[i],mod-2);
int n;
ll m;
cin>>n>>m;
poly f(n+1),g(n+1);
for(int i=0;i<=n;i++)
f[i]=fact[n]*rfact[i]%mod*max(0,n/2-i)%mod;
for(int i=0;i<=n;i++)
g[i]=rfact[i]*((i&1)?(mod-1):1)%mod;
poly h=f*g;
for(int i=0;i<=n;i++)
h[i]=h[i]*ksm(m,n-i)%mod*rfact[n-i]%mod;
poly B=exp(poly{0,1},n+n+3);
B.erase(B.begin());
B=inv(B,n+n+3);
B.resize(n+2);
poly C(n+2);
for(int i=1;i<=n+1;i++)
C[i]=ksm(m,i)*rfact[i]%mod;
poly D=B*C;
for(int i=0;i<=n;i++)
S[i]=D[i+1]*fact[i]%mod;
ll ans=0;
for(int i=0;i<=n;i++)
ans=(ans+S[i]*h[i])%mod;
ans=(ksm(m,n)*(n/2)%mod*(m+1)%mod-ans-ans+mod+mod)%mod;
cout<<ans<<'\n';
return 0;
}
这程序好像有点Bug,我给组数据试试?
详细
Test #1:
score: 100
Accepted
time: 20ms
memory: 7788kb
input:
2 3
output:
8
result:
ok 1 number(s): "8"
Test #2:
score: 0
Accepted
time: 20ms
memory: 6996kb
input:
3 3
output:
36
result:
ok 1 number(s): "36"
Test #3:
score: 0
Accepted
time: 20ms
memory: 7504kb
input:
1 1
output:
0
result:
ok 1 number(s): "0"
Test #4:
score: 0
Accepted
time: 24ms
memory: 7000kb
input:
1 2
output:
0
result:
ok 1 number(s): "0"
Test #5:
score: 0
Accepted
time: 24ms
memory: 7424kb
input:
1 3
output:
0
result:
ok 1 number(s): "0"
Test #6:
score: 0
Accepted
time: 24ms
memory: 7004kb
input:
2 1
output:
0
result:
ok 1 number(s): "0"
Test #7:
score: 0
Accepted
time: 24ms
memory: 7632kb
input:
3 1
output:
0
result:
ok 1 number(s): "0"
Test #8:
score: 0
Accepted
time: 44ms
memory: 7900kb
input:
3719 101
output:
78994090
result:
ok 1 number(s): "78994090"
Test #9:
score: 0
Accepted
time: 34ms
memory: 7644kb
input:
2189 1022
output:
149789741
result:
ok 1 number(s): "149789741"
Test #10:
score: 0
Accepted
time: 44ms
memory: 8956kb
input:
2910 382012013
output:
926541722
result:
ok 1 number(s): "926541722"
Test #11:
score: 0
Accepted
time: 1338ms
memory: 56844kb
input:
131072 3837829
output:
487765455
result:
ok 1 number(s): "487765455"
Test #12:
score: 0
Accepted
time: 1800ms
memory: 68684kb
input:
183092 100000000
output:
231786691
result:
ok 1 number(s): "231786691"
Test #13:
score: 0
Accepted
time: 1813ms
memory: 63316kb
input:
197291 937201572
output:
337054675
result:
ok 1 number(s): "337054675"
Test #14:
score: 0
Accepted
time: 1794ms
memory: 67056kb
input:
200000 328194672
output:
420979346
result:
ok 1 number(s): "420979346"
Test #15:
score: 0
Accepted
time: 1819ms
memory: 67596kb
input:
200000 1000000000
output:
961552572
result:
ok 1 number(s): "961552572"
Extra Test:
score: 0
Extra Test Passed