QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#766077 | #9254. Random Variables | ReqCxmChtChr | WA | 5ms | 13480kb | C++14 | 3.6kb | 2024-11-20 16:07:45 | 2024-11-20 16:07:45 |
Judging History
answer
#include<bits/stdc++.h>
//#pragma GCC optimize(3)
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define int long long
#define ll long long
#define ull unsigned ll
#define db double
#define ldb long db
#define mp make_pair
#define fi first
#define se second
#define pii pair<int,int>
#define pbI push_back
#define inf 1e9
#define mdI int mid=(l+r)>>1
#define lowbit(x) (x&-x)
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define MAXN 1010
#define gint __int128
#define MOD 998244353
int qread(){
char o=getchar();int f=1,x=0;
for(;!isdigit(o);o=getchar())if(o=='-')f*=-1;
for(;isdigit(o);o=getchar())x=x*10+o-'0';
return f*x;
}
void chmx(int &x,int y){if(y>x)x=y;}
void chmi(int &x,int y){if(y<x)x=y;}
bool FLA;
namespace MathPart{
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define vep(a,b,c) for(int a=b;a>=c;a--)
void exgcd(ll a,ll b,ll &x,ll &y){if(b==0){x=1,y=0;return;}exgcd(b,a%b,y,x);y-=(a/b)*x;}
ll inv(ll a,ll p=MOD){ll x,y;exgcd(a,p,x,y);return (x+p)%p;}
gint qp(ll a,ll b,ll p=MOD){gint rs=1,bs=a;while(b){if(b&1){rs=rs*bs%p;}bs=bs*bs%p;b>>=1;}return rs;}
ll fac[MAXN],ifac[MAXN];
void initF(ll n,ll p=MOD){
fac[0]=1;rep(i,1,n){fac[i]=fac[i-1]*i%p;}
ifac[n]=inv(fac[n],p);vep(i,n-1,0){ifac[i]=ifac[i+1]*(i+1)%p;}
}
ll C(ll n,ll m){if(n<m){return 0;}return fac[n]*ifac[m]%MOD*ifac[n-m]%MOD;}
ll CC(ll n,ll m,ll p=MOD){ll rs=1;rep(i,0,m-1){rs=rs*(n-i)%p*inv(i+1,MOD)%p;}return rs;}
ll S2OL(ll n,ll m){
ll rs=0,d=1,f=1;
for(ll k=0;k<=m;k++){
rs=(rs+f*C(m,k)*qp(m-k,n,MOD)%MOD+MOD)%MOD;
d=d*max(k,1ll)%MOD;f*=-1;
}return rs*inv(d,MOD)%MOD;
}
ll phi(ll a){ll rs=a,m=sqrt(a);
rep(i,2,m){if(a%i==0){rs=rs/i*(i-1);while(a%i==0){a/=i;}}}
if(a>1){rs=rs/a*(a-1);}return rs;
}
bool MR(ll pr){if(pr<2)return 0;if(pr==3)return 1;if(pr==2)return 1;
ll a=pr-1,b=0;while(!(a&1))a>>=1,b++;
for(int i=1;i<=8;++i){
ll x=rand()%(pr-2)+2,v=qp(x,a,pr),j;if(v==1||v==pr-1)continue;
for(j=0;j<b-1;j++){v=(gint)v*v%pr;if(v==pr-1)break;}
if(v!=pr-1)return 0;
}return 1;
}
}
//using namespace MathPart;
int T,mod;
int C[MAXN][MAXN];
int dp[MAXN][MAXN];
int te[MAXN];
bool FLB;
signed main(){
cerr<<((&FLB)-(&FLA))/1024.0/1024<<endl;
cin>>T>>mod;
rep(i,0,1e3){C[i][0]=1;}rep(i,1,1e3)rep(j,1,1e3){C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;}
while(T--){
int n=qread(),m=qread();
int ans=0;
rep(k,1,n){
rep(j,0,m)dp[0][j]=1;
rep(i,1,n){
rep(j,0,min((n-i)/k,m-1)){
int ne=0;
dp[i][j]=dp[i-1][j]*(m-j)%mod;
if(i>=k+1)dp[i][j]=(dp[i][j]-C[i-1][k]*dp[i-k-1][j+1]%mod*(m-j)%mod+mod)%mod;
}
}
te[k]=dp[n][0];
rep(i,1,n)rep(j,0,min((n-i)/k,m-1))dp[i][j]=0;
rep(j,0,min(n/k,m-1))dp[0][j]=0;
}
rep(k,1,n)ans=(ans+(te[k]-te[k-1])*k)%MOD;
printf("%lld\n",ans);
}
}
/*
3 123456789
3 2
5 5
7 7
*使用球盒模型描述问题(重在换)
考虑<=k
n个相互区分之小球放入m个相互区分之盒子,每一个应<=k
需要递推,一个一个盒子考虑,难以变优。
从球考虑,f[n][m]=f[n-1][m]*m-C(n-1,k)f[n-k-1][m-1] (这个是容斥角度) (如果没有远虑的话,挺难考虑把m作为下标的)
实际上有用的m极少,边界在n=0时,因为m至多减少n/k,变换递推式
f[n][dm]=f[n-1][dm]*(m-dm)-C(n-1,k)-C(n-1,k)f[n-k-1][dm+1]
边界在n=0时,值为1,实际上直接每组T求即可
考虑(m-dm)会不会为负,显然有变为0的过程,定然为0
*/
详细
Test #1:
score: 100
Accepted
time: 5ms
memory: 12740kb
input:
3 123456789 3 2 5 5 7 7
output:
18 7145 2066323
result:
ok 3 lines
Test #2:
score: -100
Wrong Answer
time: 5ms
memory: 13480kb
input:
100 2 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 10 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 2 10 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 3 10 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 4 10 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 5 10 6 1 6 2 6 3 6 4 6 5 6 6 6 7 6 8 6 9 6 10 7 1 7 2 7 3 7 4 7 5 7 6 7 7 7 8 7 9 7 10 8 1 8 2...
output:
1 0 1 0 1 0 1 0 1 0 2 0 2 0 2 0 2 0 2 0 3 0 3 0 3 0 3 0 3 0 4 0 4 0 4 0 4 0 4 0 5 0 5 0 5 0 5 0 5 0 6 0 6 0 6 0 6 0 6 0 7 0 7 0 7 0 7 0 7 0 8 0 8 0 8 0 8 0 8 0 9 0 9 0 9 0 9 0 9 0 10 0 10 0 10 0 10 0 10 0
result:
wrong answer 11th lines differ - expected: '0', found: '2'