博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj4197
阅读量:7244 次
发布时间:2019-06-29

本文共 1242 字,大约阅读时间需要 4 分钟。

这题现场想的思路方向都是对的,但限于现场和实力因素没能A

很显然我们会想到质因数的选取

如果某个质数p被W选了,那G就不能选含有质因子p的数

因此我们不难想到状压质数的选取情况,令f[i][j]为w质数选取状态为i,g质数选取状态j的方案数

但是500以内质数太多了怎么办?我们考虑大质数能不能分开考虑

考虑到sqrt(500)以外的质数,他们在每个数中最多出现一次,因此我们只要按这些质数分类做dp即可

这样需要状压的质数只有2,3,5,7,11,13,17,23这8个了,这样就可以解决了

具体的,我用state表示每个数前8个质数的含有情况,res表示除去前8个质数剩下的数

然后按照res排序做dp即可

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 8 using namespace std; 9 const int sp[8]={ 2,3,5,7,11,13,17,19};10 struct node{ int res,st;} a[510];11 12 int f[256][256],g[2][256][256];13 int ans,n,p;14 bool cmp(node a,node b)15 { 16 return a.res
=0;u--)51 for (int v=255;v>=0;v--)52 if ((u&v)==0)53 {54 if ((a[j].st&v)==0) g[0][u|a[j].st][v]=(g[0][u|a[j].st][v]+g[0][u][v])%p;55 if ((a[j].st&u)==0) g[1][u][v|a[j].st]=(g[1][u][v|a[j].st]+g[1][u][v])%p; 56 } 57 i=j-1;58 }59 for (int u=0; u<256; u++)60 for (int v=0; v<256; v++)61 f[u][v]=((g[0][u][v]+g[1][u][v]-f[u][v])%p+p)%p;62 }63 for (int i=0; i<=255; i++)64 for (int j=0; j<=255; j++)65 if ((i&j)==0) ans=(ans+f[i][j])%p;66 printf("%d\n",ans);67 return 0;68 }
View Code

 

转载于:https://www.cnblogs.com/phile/p/5658530.html

你可能感兴趣的文章
last 命令
查看>>
输出元素n的所有组合数
查看>>
java学习------异常
查看>>
Android - Activity定制横屏(landscape)显示
查看>>
JavaScript提高:005:ASP.NET使用easyUI TABS标签显示问题
查看>>
ELK
查看>>
程序员们、PD们,你敢这样在家办公吗?
查看>>
shader 例子学习
查看>>
hive优化分享
查看>>
java中Action层、Service层和Dao层的功能区分
查看>>
命令模式
查看>>
HTML滚动字幕代码参数详解及Js间隔滚动代码
查看>>
android中DatePicker和TimePicker的使用
查看>>
ByteArrayXXXputStream、InputStream的read()方法
查看>>
J-LINK V8固件烧录指导
查看>>
F# 3.0新特性简介
查看>>
如何用VB6 创建 DCOM Client/Server Application
查看>>
C#获取打印机状态
查看>>
斜率优化DP
查看>>
Sql2005+:sp_MS_marksystemobject 数据库DB执行上下文
查看>>