题目大意

有两个集合\(S_1,S_2 \subseteq [2,n] (n\leq 500)\),且对于\(\forall x\in S_1,y\in S_2 , gcd(x,y)=1\)

求\(S_1,S_2\)有多少种方案

两种方案不同,当且仅当 方案一的\(S_1\)与方案二的\(S_1\)存在一个元素不同 或 方案一的\(S_2\)与方案二的\(S_2\)存在一个元素不同

题解

当\(n\leq 100\)时,设\(f(A_1,A_2)\)表示当\(S_1\)中所有数的质因子集合为\(A_1\),\(S_2\)中所有数的质因子集合为\(A_2\)时的方案数,枚举2到\(n\)的每个数放到哪个集合里,直接dp

当\(n\leq 500\)时,发现对于每个大于\(\sqrt{n}\)的质数,它作为质因子时的幂次数不超过一

那么对于每个大于\(\sqrt{n}\)的质数,枚举包含它的所有数都被分到\(S_1\)还是\(S_2\),设\(g(i,A_1,A_2)\)表示当包含当前枚举的这个质因数的数都在\(S_i\)里,\(S_1\)中所有数的质因子集合为\(A_1\),\(S_2\)中所有数的质因子集合为\(A_2\)时的方案数,还是直接dp

代码
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<iomanip>
#include<iostream>
#include<map>
#include<queue>
#include<set>
#include<stack>
#include<vector>
#define rep(i,x,y) for(register int i=(x);i<=(y);++i)
#define dwn(i,x,y) for(register int i=(x);i>=(y);--i)
#define maxn 510
#define maxs ((1<<8)+7)
#define LL long long
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)&&ch!='-')ch=getchar();
if(ch=='-')f=-1,ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return x*f;
}
void write(int x)
{
if(x==0){putchar('0'),putchar('\n');return;}
int f=0;char ch[20];
if(x<0)putchar('-'),x=-x;
while(x)ch[++f]=x%10+'0',x/=10;
while(f)putchar(ch[f--]);
putchar('\n');
return;
}
int n,mod,no[maxn],p[maxn],cntp,bul[maxn][maxn],son[maxn],f[maxs][maxs],f1[maxs][maxs],vis[maxn],f2[maxs][maxs];
signed main()
{
n=read(),mod=read();
rep(i,2,n)
if(!no[i])
{
p[++cntp]=i;
for(int j=i+i;j<=n;j+=i)no[j]=1;
}
rep(i,2,n)
{
int lim=min(8,cntp);
rep(j,1,lim)if(i%p[j]==0)son[i]|=(1<<(j-1));
int f=8;
for(int j=9;j<=cntp&&p[j]<=i;j++)if(i%p[j]==0){f=j;break;}
bul[f][++bul[f][0]]=i;
}
int fulls=(1<<8)-1;f[0][0]=1;
rep(j,1,bul[8][0])
{
int num=bul[8][j];
dwn(s1,fulls,0)
dwn(s2,fulls,0)
{
if(!(son[num]&s2))(f[s1|son[num]][s2]+=f[s1][s2])%=mod;
if(!(son[num]&s1))(f[s1][s2|son[num]]+=f[s1][s2])%=mod;
}
}
rep(i,9,cntp)
{
if(bul[i][0])memcpy(f1,f,sizeof(f)),memcpy(f2,f,sizeof(f));
rep(j,1,bul[i][0])
{
int num=bul[i][j];
dwn(s1,fulls,0)
dwn(s2,fulls,0)
{
if(!(son[num]&s2))(f1[s1|son[num]][s2]+=f1[s1][s2])%=mod;
if(!(son[num]&s1))(f2[s1][s2|son[num]]+=f2[s1][s2])%=mod;
}
}
if(bul[i][0])rep(s1,0,fulls)rep(s2,0,fulls)f[s1][s2]=((f1[s1][s2]+f2[s1][s2]-f[s1][s2])%mod+mod)%mod;//既不放1号集合也不放2号集合的情况算重复了,要减去
}
int ans=0;
rep(s1,0,fulls)rep(s2,0,fulls)(ans+=f[s1][s2])%=mod;
write(ans);
return 0;
}

并不对劲的bzoj4197:loj2131:uoj129:p2150:[NOI2015]寿司晚宴的更多相关文章

  1. BZO4197 & 洛谷2150 & UOJ129:[NOI2015]寿司晚宴——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4197 https://www.luogu.org/problemnew/show/P2150 ht ...

  2. 【uoj129】 NOI2015—寿司晚宴

    http://uoj.ac/problem/129 (题目链接) 题意 给出2~n这n-1个数,求选2个集合,使得从两集合中任意各选取1个数出来它们都互质.求方案数. Solution PoPoQQQ ...

  3. UOJ #129 / BZOJ 4197 / 洛谷 P2150 - [NOI2015]寿司晚宴 (状压dp+数论+容斥)

    题面传送门 题意: 你有一个集合 \(S={2,3,\dots,n}\) 你要选择两个集合 \(A\) 和 \(B\),满足: \(A \subseteq S\),\(B \subseteq S\), ...

  4. p2150 [NOI2015]寿司晚宴

    传送门 分析 我们发现对于大于$\sqrt(n)$的数每个数最多只会包含一个 所以我们把每个数按照大质数的大小从小到大排序 我们知道对于一种大质数只能被同一个人取 所以f1表示被A取,f2表示被B取 ...

  5. 洛谷$P2150\ [NOI2015]$寿司晚宴 $dp$

    正解:$dp$ 解题报告: 传送门$QwQ$. 遇事不决写$dp$($bushi$.讲道理这题一看就感觉除了$dp$也没啥很好的算法能做了,于是考虑$dp$呗 先看部分分?$30pts$发现质因数个数 ...

  6. 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数

    [BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...

  7. [UOJ#129][BZOJ4197][Noi2015]寿司晚宴

    [UOJ#129][BZOJ4197][Noi2015]寿司晚宴 试题描述 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司 ...

  8. [BZOJ4197][Noi2015]寿司晚宴

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 412  Solved: 279[Submit][Status] ...

  9. BZOJ 4197: [Noi2015]寿司晚宴( dp )

    N^0.5以内的质数只有8个, dp(i, j, k)表示用了前i个大质数(>N^0.5), 2人选的质数(<=N^0.5)集合分别为j, k时的方案数. 转移时考虑当前的大质数p是给哪个 ...

随机推荐

  1. Charm Bracelet(01背包)

    Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fil ...

  2. poj2446 Chessboard 【最大匹配】

    题目大意:一个n*m的棋盘,某些格子不能用,问用1*2的骨牌能否完全覆盖这个棋盘,当然,骨牌不能有重叠 思路:显然黑白染色后,一个骨牌只能覆盖一个白色格子和一个黑色格子,然后我们间二染色建图,看能否有 ...

  3. SpringBoot自动配置的源码解析

    首先,写源码分析真的很花时间,所以希望大家转的时候也请注明一下,Thanks♪(・ω・)ノ SpringBoot最大的好处就是对于很多框架都默认的配置,让我们开发的时候不必为了大一堆的配置文件头疼,关 ...

  4. myql导入导出命令

    1.导出整个数据库 mysqldump -u 用户名 -p --default-character-set=latin1 数据库名 > 导出的文件名(数据库默认编码是latin1) mysqld ...

  5. python-web apache mod_python 模块的安装

    安装apache 下载mod_python 编译安装 测试 下载mod_python,下载地址:mod_python 在GitHub 上面, 下载之后:目录结构如下: 安装依赖: #查找可安装的依赖 ...

  6. msp430入门编程35

    msp430中C语言的可移植--规划软件层次

  7. SqlSugar最容易使用的ORM

    SqlSugar官网

  8. Java泛型的主要用途

    1.泛型的主要用途就是代替各种类型,作为一个笼统的整体类型代替,也就是代替参数,不论是传入参数还是返回参数.都可以用泛型来代替. 如dao操作类的增删改查操作,因为传入参数的类型不同,但基本都是相同接 ...

  9. 【深度探索c++对象模型】Function语义学之成员函数调用方式

    非静态成员函数 c++的设计准则之一就是:非静态成员函数至少和一般的非成员函数有相同的效率.编译器内部已将member函数实体转换为对等的nonmember函数实体. 转化步骤: 1.改写函数原型以安 ...

  10. CF 234 C Weather(粗暴方法)

    C. Color Stripe time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...