乘积

题目背景

\(\mathrm{Smart}\) 最近在潜心研究数学, 他发现了一类很有趣的数字, 叫做无平方因子数。 也就是这一类数字不能够被任意一个质数的平方整除, 比如\(6\)、\(7\)、\(10\)都是无平方因子数, 而\(12\)则不是。

题目描述

所以 \(\mathrm{Smart}\) 在思考一个问题——选择不超过 \(K\) 个 \(N\) 以内的正整数乘起来, 使得乘积是一个无平方因子数, 有多少种取法? (每个数只能取一次)

输入输出格式

输入格式

第一行一个整数 \(T\) 表示数据组数。
接下来 \(T\) 行, 每行两个整数 \(N\),\(K\), 意思如题面所述。

输出格式

对于每一组数据, 输出一个整数表示取法的方案数对 \(10^9+7\) 取模后的数值。

说明

\(10\%\)的数据: \(N≤8\);

\(40\%\)的数据: \(N≤16\);

\(70\%\)的数据: \(N≤30\);

\(100\%\)的数据: \(1≤T≤5\); \(1≤K≤N≤500\)。


70pts 有非常多种搞法,然而状压是最难写的但是最可能继续玩出正解的。。

可是我太菜,比赛时写了个麻烦的状压

\(dp[i][j][s]\)代表前\(i\)个数选择了\(j\)个素数状态为\(s\)的方案数

Code:

#include <cstdio>
#include <cstring>
const int N=502;
int num[30][10],dat[30];
int pri[N],is[N],v[N],cnt,tot;
int div[N][100];
void init()
{for(int i=2;i<=500;i++){if(!is[i]){pri[++cnt]=i;v[i]=i;}for(int j=1;j<=cnt&&i*pri[j]<=500;j++){if(v[i]<pri[j]) break;v[i*pri[j]]=pri[j];is[i*pri[j]]=1;}}for(int i=2;i<=500;i++){int t=i;for(int j=1;j<=cnt;j++)while(t%pri[j]==0)div[i][j]++,t/=pri[j];}for(int i=2;i<=33;i++){int flag=1;for(int j=1;j<=12;j++)if(div[i][j]>1) {flag=0;break;}if(!flag) continue;++tot;dat[tot]=i;for(int j=1;j<=12;j++)if(div[i][j])num[tot][j]=1;}
}
int mod=1e9+7;
int n0,k;
int dp[20][20][1200];
void work()
{scanf("%d%d",&n0,&k);int l=0,n=0;for(int i=1;;i++)//素数长度上界{if(pri[i]<=n0) ++l;else break;}for(int i=1;;i++)//选数个数上界{if(dat[i]<=n0) ++n;else break;}k=(k<=n?k:n);memset(dp,0,sizeof(dp));for(int i=0;i<=n;i++) dp[i][0][0]=1;int ans=0;for(int i=1;i<=n;i++)//前i个数for(int j=1;j<=k;j++)//取了j个for(int s=1;s<1<<l;s++)//素数集合状态{int las=s,flag=1;dp[i][j][s]=dp[i-1][j][s];for(int q=1;q<=l;q++)if(num[i][q])//如果这一位是1{if((s>>q-1)&1) las^=1<<q-1;//变成0else {flag=0;break;}}if(flag) (dp[i][j][s]+=dp[i-1][j-1][las])%=mod;}for(int i=1;i<=k;i++)for(int s=1;s<1<<l;s++){if(i!=k) (ans+=dp[n][i][s]<<1)%=mod;else (ans+=dp[n][i][s])%=mod;}printf("%d\n",ans+1);
}
int main()
{freopen("mult.in","r",stdin);freopen("mult.out","w",stdout);init();int t;scanf("%d",&t);while(t--)work();return 0;
}

而正解只是运用分组背包的思想

注意到大于19的质数只可能出现一个

那我们实际上就只需要找到状压2,3,5,7,11,13,17,19这几个素数就行了

其他大于19的素数按照这个素数进行分组,剩下的同时按前几个素数做就可以了

很巧妙的思想,然而数据不好造,答案一样的期望炒鸡高

Code:

#include <cstdio>
#include <cstring>
#include <vector>
#define ll long long
const int N=500;
const ll mod=1e9+7;
const int pri[9]={0,2,3,5,7,11,13,17,19};
using namespace std;
vector <int > g[N+10];
int belong[N+10],sta[N+10],n,k;
void init()
{memset(belong,0,sizeof(belong));memset(sta,0,sizeof(sta));for(int i=1;i<=N;i++) g[i].clear();for(int i=1;i<=n;i++){belong[i]=i;for(int j=1;j<=8;j++){if(i%(pri[j]*pri[j])==0) {sta[i]=-1;break;}else if(i%pri[j]==0) {belong[i]/=pri[j];sta[i]|=1<<j-1;}}}for(int i=1;i<=n;i++){if(~sta[i]){if(belong[i]!=1)g[belong[i]].push_back(sta[i]);elseg[i].push_back(sta[i]);}}
}
ll dp[N+10][256];
void work()
{scanf("%d%d",&n,&k);init();memset(dp,0,sizeof(dp));dp[0][0]=1;for(int i=1;i<=n;i++){for(int j=k;j;j--)for(int s=255;~s;s--){if(!dp[j][s]) continue;for(int l=0;l<g[i].size();l++){int now=g[i][l];if(now&s) continue;(dp[j][now|s]+=dp[j-1][s])%=mod;}}    }ll ans=0;for(int i=1;i<=k;i++)for(int s=0;s<=255;s++)(ans+=dp[i][s])%=mod;printf("%lld\n",ans);
}
int main()
{//freopen("mult.in","r",stdin);//freopen("mult.out","w",stdout);int t;scanf("%d",&t);while(t--)work();return 0;
}

2018.8.20

转载于:https://www.cnblogs.com/butterflydew/p/9507033.html

安徽师大附中%你赛day7 T2 乘积 解题报告相关推荐

  1. 无聊的活动/缘生意转(2018 Nova OJ新年欢乐赛B题)解题报告

    题目2(下面的太抓 我重新写了个背景 其他都一样) 无聊的活动 JLZ老师不情愿的参加了古风社一年一度的活动,他实在不觉得一群学生跳舞有什么好看,更不明白坐在身后的学生为什么这么兴奋(看小姐姐),于是 ...

  2. XTU新生赛B题 ABK 解题报告

    题目描述 ABK是一个比A+B还要简单的题目,给出两个整数A,B,求出A和B的第K大公约数. 输入 第一行是一个整数N(N ≤ 10000),表示样例的个数. 以后每行一个样例,为3个整数A,B,K ...

  3. 洛谷 10月 csp-s 模拟赛 T1,T2解析及代码

    洛谷 10月 csp-s 模拟赛 T1,T2解析及代码 T1 Magenta Potion 题目描述 给定一个长为 nnn 的整数序列 aaa,其中所有数的绝对值均大于等于 222.有 qqq 次操作 ...

  4. 关于安徽赛区推广校赛的实施办法

    关于安徽赛区 推广校赛的实施办法 全国组委会:   安徽赛区作为第一个省级赛区自2010年举办至今,受到安徽省教育厅和安徽各高校高度认可,是安徽省教育厅重点支持的大学生学科和技能竞赛A类赛事.但安徽赛 ...

  5. 中国最新奥数竞赛成绩出炉:南师大附中女生严彬玮满分夺冠!60人国家集训队名单公布...

    雷刚 发自 副中心  量子位 报道 | 公众号 QbitAI 第35届中国数学奥林匹克竞赛成绩公布. 同时也意味着新一届中国奥数国家集训队,正式集结. 60名中学生. 湖北贡献9人.广东7人,上海6人 ...

  6. 2021年兰州师大附中高考成绩查询,2021年兰州重点高中名单及排名,兰州高中高考成绩排名榜...

    "一千个人眼中,就有一千个哈姆雷特".关于兰州高职学校排名,每个人的观点也是各不相同,今天就给大家分享一下我心中的兰州高中排名及格局分布,主要参考依据是近年中考录取分数线及高考成绩 ...

  7. 2021年兰州师大附中高考成绩查询,西北师范大学附属中学2021年排名

    我们想了解的是这个学校的师资怎样,办学这么久以来有获得了什么样的成绩,获得了什么样的荣誉,这个学校是省级示范高中还是市级示范高中,而这个级别的什么样的排名情况,下面我为大家整理了作为省级示范高中学校的 ...

  8. 南师大附中2021高考成绩查询,2021高考倒计时,你有一份师大附中专属回忆录待查收~...

    原标题:2021高考倒计时,你有一份师大附中专属回忆录待查收~ NO.1442 距离2021年高考不到24小时...... 对于大部分人来说,人生中没有任何一场考试比高考更加惊心动魄. 同样地,也没有 ...

  9. 2021高考甘肃师大附中成绩查询,2021甘肃理科高考成绩排名一分一档表,甘肃高考理科成绩排名查询...

    2015甘肃理科高考成绩排名一分一档表甘肃高考理科成绩排名查询 肃省2017年高考文科状元出炉,来自民乐一中的王复英以总分676分摘取理科第一名桂冠.文科状元惠雅婕来自西北师大附中,总分660分.恭喜 ...

  10. 哈师大大二有计算机课,哈师大附中晨风计算机社团

    晨风计算机社团 社团介绍 附中校园论坛于2001年由学生自主编程创办,是哈市第一个由学生建立的校园论坛.论坛由在校学生独立维护并管理,旨在为大家提供一个畅所欲言.交流心声的平台,成为在校生活中亮丽的一 ...

最新文章

  1. 【C++】50.编程中切换状态的【有限状态机】
  2. 查看当前服务器中的所有的topic,创建topic,删除topic,通过shell命令发送消息,通过shell消费消息,查看topic详情,对分区数进行修改
  3. [Kafka与Spark集成系列四] Spark运行结构
  4. TensorFlow自带例子已经包含了android和ios下的摄像头图像分类示例Inception v1,这里补充一个Windows下的,使用AForge库(www.aforgenet.com)操作
  5. python环境变量配置_Python的安装、认识、配置环境变量以及helloworld打印的两种方式
  6. 二级c语言题型分数,计算机二级C语言题型和评分标准
  7. python 无头浏览器_Python对Selenium调用浏览器进行封装包括启用无头浏览器,及对应的浏览器配置文件...
  8. Centos7 安装编译nbd模块步骤
  9. Automator——为mac创建自定义mac右键菜单
  10. PDF不能打印怎么办?
  11. “一杯严选”的2019猪年新春贺岁 “福鼎一杯”生态@复联复兴者联盟
  12. Quartus2_13.0初级使用教程
  13. GPS模块——基于Arduino
  14. 记录云打印小程序搭建及运营心得。
  15. cxf-spring-pratice-service
  16. mysql源码安装(带图详解)
  17. 全国地级市1999—2020年工业企业数
  18. 服务器充电桩是什么显示,高速公路服务区的充电桩一般要冲多久
  19. NBA 全明星歌曲:《I believe I can fly》
  20. android ida调试x86模拟器

热门文章

  1. Java语言高级-常用API-第四节 ArrayList集合
  2. html中背景简写,css中background简写属性
  3. numpy.linalg 中的逆矩阵 inv
  4. 2021-10-14 谷歌浏览器更改默认搜索引擎
  5. 串口打印调试信息(干货)
  6. 双系统开机 进入grub resource,并且进不bios
  7. 用matlab进行频域分析,用matlab进行信号与系统的时频域分析
  8. redis cli命令详解
  9. 升级bigsur_2年内彻底摆脱英特尔,苹果重磅发布自研Mac芯片,并对“五大系统”再升级...
  10. R语言字符串相关操作