QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#245976 | #5495. 寿司晚宴 | cjs | 100 ✓ | 834ms | 52752kb | C++14 | 1.7kb | 2023-11-10 14:55:57 | 2023-11-10 14:55:59 |
Judging History
answer
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=505,M=105,K=260;
int n,m,cnt,P;
int p[M],q[M],a[M],val[M],v[N];
int st[N],f[N][K],h[N][K];
int g[M][K][K];
bool vis[N];
bool check(int x){
for(int i=2;i*i<=x;i++)if(x%i==0)return 0;
return 1;
}
signed main()
{
cin>>n>>P;
for(int i=2;i<=n;i++){
if(check(i)){
if(i*i<=n){
p[++cnt]=i;
}
else {
q[++m]=i;
}
}
}
q[0]=1;
for(int s=0;s<1<<cnt;s++){
int t=0,tot=0;
for(int i=0;i<cnt;i++){
if(s>>i&1){
a[++t]=p[i+1];
val[t]=1<<i;
}
}
memset(vis,0,sizeof(vis));
memset(st,0,sizeof(st));
vis[1]=1;
for(int i=1;i<=t;i++){
for(int j=a[i];j<=n;j++)if(j%a[i]==0){
vis[j]|=vis[j/a[i]];
}
}
for(int i=1;i<=n;i++)if(vis[i]){
v[++tot]=i;
for(int j=1;j<=t;j++)if(i%a[j]==0)st[tot]+=val[j];
}
memset(f,0,sizeof(f));
f[0][0]=1;
for(int i=1;i<=tot;i++){
for(int T=0;T<=s;T++)if((T|s)==s){
f[i][T]+=f[i-1][T];
if(i^1)f[i][T|st[i]]+=f[i-1][T];
f[i][T]%=P;
f[i][T|st[i]]%=P;
}
}
for(int i=0;i<=m;i++){
int L=1;
while(v[L+1]*q[i]<=n&&L+1<=tot)L++;
h[i][s]=f[L][s];
if(i&&s)h[i][s]=h[i][s]*2%P;
}
}
int ans=0;
for(int i=0;i<=m;i++){
for(int s=0;s<1<<cnt;s++){
for(int t=0;t<1<<cnt;t++)if(!(s&t)){
if(!i){
g[i][s][t]=h[0][s]*h[0][t]%P;
continue;
}
g[i][s][t]+=g[i-1][s][t];
g[i][s][t]%=P;
for(int T=0;T<1<<cnt;T++){
g[i][s|T][t]+=g[i-1][s][t]*h[i][T];
g[i][s|T][t]%=P;
g[i][s][t|T]+=g[i-1][s][t]*h[i][T];
g[i][s][t|T]%=P;
}
if(i==m){
ans+=g[i][s][t];
ans%=P;
}
}
}
}
cout<<ans;
return 0;
}
详细
Test #1:
score: 10
Accepted
time: 0ms
memory: 6612kb
input:
2 1
output:
0
result:
ok single line: '0'
Test #2:
score: 10
Accepted
time: 1ms
memory: 6320kb
input:
13 12345
output:
3438
result:
ok single line: '3438'
Test #3:
score: 10
Accepted
time: 2ms
memory: 6600kb
input:
26 1000000000
output:
447212583
result:
ok single line: '447212583'
Test #4:
score: 10
Accepted
time: 3ms
memory: 7240kb
input:
99 90000001
output:
88114119
result:
ok single line: '88114119'
Test #5:
score: 10
Accepted
time: 0ms
memory: 6296kb
input:
50 19999991
output:
16185855
result:
ok single line: '16185855'
Test #6:
score: 10
Accepted
time: 4ms
memory: 8496kb
input:
144 1000000000
output:
108118957
result:
ok single line: '108118957'
Test #7:
score: 10
Accepted
time: 12ms
memory: 11768kb
input:
197 1200007
output:
132550
result:
ok single line: '132550'
Test #8:
score: 10
Accepted
time: 96ms
memory: 22036kb
input:
289 1200007
output:
1181263
result:
ok single line: '1181263'
Test #9:
score: 10
Accepted
time: 639ms
memory: 40500kb
input:
362 99991111
output:
81393435
result:
ok single line: '81393435'
Test #10:
score: 10
Accepted
time: 834ms
memory: 52752kb
input:
499 99999999
output:
7282170
result:
ok single line: '7282170'
Extra Test:
score: 0
Extra Test Passed