P2150 [NOI2015] 寿司晚宴 题解
P2150 [NOI2015] 寿司晚宴
首先容易想到,一种方案是 “和谐的” 当且仅当这两个人品尝的寿司集合中,不存在包含相同质因子的数。
考虑把所有质因子的存在情况压成一个二进制数,然后从
显然
但是注意到,对于
所以,我们把这个多出来的一种质因数拎出来,也就是说,以前我们按照
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
constexpr int MAXN=505;
int n,p,ans;
vector<int>pri;
int xpr[MAXN];
bool isp[MAXN];
struct Node{
int v,b,s;
bool operator<(const Node&x)const{
return b<x.b;
}
}a[MAXN];
int dp[256][256],f[256][256],g[256][256];
void add(int&x,int y){
x=x+y>=p?x+y-p:x+y;
}
void init(){
for(int i=2;i<=n;i++){
if(!isp[i]) pri.emplace_back(i),xpr[i]=i;
for(auto j:pri){
if(i*j>n) break;
isp[i*j]=1;
xpr[i*j]=j;
if(i%j==0) break;
}
}
}
int gb(int x){
if(x==2) return 0;
if(x==3) return 1;
if(x==5) return 2;
if(x==7) return 3;
if(x==11) return 4;
if(x==13) return 5;
if(x==17) return 6;
return 7;
}
int main(){
scanf("%d%d",&n,&p);
init();
for(int i=2,x;i<=n;i++){
x=a[i].v=i;
a[i].b=-1;
while(x>1){
if(xpr[x]<=19) a[i].s|=1<<gb(xpr[x]);
else a[i].b=max(a[i].b,xpr[x]);
x/=xpr[x];
}
}
sort(a+2,a+n+1);
dp[0][0]=1;
for(int i=2;i<=n;i++){
if(!~a[i].b||a[i].b!=a[i-1].b){
memcpy(f,dp,sizeof(f));
memcpy(g,dp,sizeof(g));
}
for(int j=255;~j;j--)
for(int k=255;~k;k--){
if(j&k) continue;
if(!(a[i].s&j)) add(f[j][k|a[i].s],f[j][k]);
if(!(a[i].s&k)) add(g[j|a[i].s][k],g[j][k]);
}
if(!~a[i].b||a[i].b!=a[i+1].b)
for(int j=255;~j;j--)
for(int k=255;~k;k--){
if(j&k) continue;
dp[j][k]=((f[j][k]+g[j][k])%p-dp[j][k]+p)%p;
}
}
for(int i=0;i<=255;i++)
for(int j=0;j<=255;j++){
if(i&j) continue;
add(ans,dp[i][j]);
}
printf("%d\n",ans);
return 0;
}
即得易见平凡,仿照上例显然。留作习题答案略,读者自证不难。
反之亦然同理,推论自然成立。略去过程 ,由上可知证毕。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】