[LOJ6356]四色灯
[LOJ6356]四色灯
题目大意:
有\(n(n\le10^9)\)个编号\(1\sim n\)的格子和\(m(m\le20)\)个按钮。每个格子有一个初始为\(0\)的数,每个按钮有一个数字\(a_i\),表示若这个按钮被选中,编号为\(a_i\)倍数的格子上的数字\(+1\)。
现在随机选取一个按钮的集合,求数值为\(4\)的倍数的格子的期望个数。
思路:
用\(f(S)\)表示\(1\sim n\)中,编号为\(\operatorname{lcm}(S)\)的倍数的格子数。
\(g(S)\)表示\(1\sim n\)中,编号\(x\)为\(\operatorname{lcm}(S)\)的倍数,且不存在集合\(T\),满足\(S\in T\)且\(\operatorname{lcm}(T)|x\)的格子数。
则答案为\(\sum\limits_{S}g(S)\sum\limits_{k}{|S|\choose 4k}\cdot2^{m-4k}\)。
时间复杂度\(\mathcal O(3^m)\)。
由于相同大小的集合,其贡献可以一起算。因此我们用\(G(x)\)表示\(\sum\limits_{|S|=x}g(S)\),则最终答案可表示为\(\sum\limits_{i}g(i)\sum\limits_{k}{i\choose 4k}\cdot2^{m-4k}\)。
时间复杂度\(\mathcal O(2^mm)\)。
源代码:
#include<cstdio>
#include<cctype>
#include<algorithm>
#define popcount __builtin_popcount
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
typedef long long int64;
const int M=21,mod=998244353;
int a[M],f[M],g[M],c[M][M];
void exgcd(const int &a,const int &b,int &x,int &y) {
if(!b) {
x=1,y=0;
return;
}
exgcd(b,a%b,y,x);
y-=a/b*x;
}
inline int inv(const int &x) {
int ret,tmp;
exgcd(x,mod,ret,tmp);
return (ret%mod+mod)%mod;
}
int main() {
const int n=f[0]=getint(),m=getint();
for(register int i=0;i<=m;i++) {
for(register int j=c[i][0]=1;j<=i;j++) {
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
}
for(register int i=0;i<m;i++) {
a[i]=getint();
}
for(register int s=1;s<1<<m;s++) {
int64 lcm=0;
for(register int i=0;i<m;i++) {
if((s>>i)&1) {
lcm=lcm?lcm*a[i]/std::__gcd(lcm,1ll*a[i]):a[i];
}
if(lcm>n) break;
}
(f[popcount(s)]+=n/lcm)%=mod;
}
std::copy(&f[0],&f[m]+1,g);
for(register int i=m;i>=0;i--) {
for(register int j=i+1;j<=m;j++) {
g[i]-=1ll*g[j]*c[j][i]%mod;
(g[i]+=mod)%=mod;
}
}
int ans=0;
for(register int i=0;i<=m;i++) {
int tmp=0;
for(register int j=0;j<=i;j+=4) {
(tmp+=1ll*c[i][j]*(1<<(m-i))%mod)%=mod;
}
(ans+=1ll*g[i]*tmp%mod)%=mod;
}
printf("%lld\n",1ll*ans*inv(1<<m)%mod);
return 0;
}
[LOJ6356]四色灯的更多相关文章
- LOJ6356 四色灯(容斥+dp
纪念第一次所有的解析全写在代码里面 QWQ 这里就简单说几句了 首先一个灯有贡献,当且仅当他被按了\(4k\)次. 那么我们定义\(f(S)\)表示\([1,n]\)中有多少个数\(x\)是集合\(S ...
- .NET应用架构设计—面向对象分析与设计四色原型模式(彩色建模、领域无关模型)(概念版)
阅读目录: 1.背景介绍 2.问自己,UML对你来说有意义吗?它帮助过你对系统进行分析.建模吗? 3.一直以来其实我们被一个缝隙隔开了,使我们对OOAD遥不可及 4.四色原型模式填补这个历史缝隙,让我 ...
- DDD:四色原型中Role的 “六” 种实现方式
背景 一个实体在不同的上下文中具备不同的职责,如:产品在“生产完成上下文”中具备的一些职责,在“质检相关上下文”中具备另外一些职责.四色原型.DIC和“UML事物模式”在不同的维度阐述了这一情况,在代 ...
- .NET应用架构设计—四色原型模式(色彩造型、域无关的模型)(概念版)
阅读文件夹: 1.背景介绍 2.问自己,UML对你来说有意义吗?它帮助过你对系统进行分析.建模吗? 3.一直以来事实上我们被一个缝隙隔开了,使我们对OOAD遥不可及 4.四色原型模式填补这个历史缝隙, ...
- DDD:四色原型中Role的 “六” 种实现方式和PHP的Swoole扩展
目录 背景六种实现方式第一种:未显式体现角色的模式.第二种:使用“显式接口”显式体现角色的模式.第三种:使用“扩张方法”显式体现角色的模式.第四种:使用“领域服务”显式体现角色的模式.第五种:使用“包 ...
- 四色GDOI&GDOI2015滚粗记
好吧自己太弱写不了什么四色NOI只能学学别人写个四色GDOI了...首先自己还是太弱所以就被学校卡了个名额就进不了省队了QAQ.自己GDOI觉得考得不错可是NOIP毕竟少了人家5分根本追不上去好不QA ...
- POJ-1129 DFS染色+四色原理的应用
OJ-ID: POJ-1129 author: Caution_X date of submission: 20190927 tags: DFS+四色原理的应用 descri ...
- [ZigBee] 13、ZigBee基础阶段性回顾与加深理解——用定时器1产生PWM来控制LED亮度(七色灯)
引言:PWM对于很多软件工程师可能又熟悉又陌生,以PWM调节LED亮度为例,其本质是在每个周期都偷工减料一些,整体表现出LED欠压亮度不同的效果.像大家看到的七色彩灯其原理也类似,只是用3路PWM分别 ...
- 基于arm开发板四个按键控制四个灯亮
基于s5pv2410,cortex a8的四个按键每一个按键点了对应的灯 对于用汇编来编程的话不难,重点在于数据手册,电路图,管脚的看懂 直接上代码 .globl _start_start: ldr ...
随机推荐
- gitlab原理
GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务. 其实,说直白点写,他就是个git服务器,和github差不多,只不过,这个gitlab可 ...
- war的创建
- DapperHelper 帮助类
using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...
- 使用newtonjson解决Json日期格式问题
继承 JsonResult 方式 使用Json.Net代替最简单的方法就是使用下面的JsonNetResult 来作为 ActionResult 返回. 1) Install-Package newt ...
- 阿里 Goldeneye 四个环节落地智能监控:预测、检测、报警及定位
阿里 Goldeneye 四个环节落地智能监控:预测.检测.报警及定位 https://www.infoq.cn/article/alibaba-goldeneye-four-links
- 自定义Spring标签
写了好几次了,结果一段时间之后就忘记了自己有写好的example,但是最后还是决定重新写一遍,把这个步骤记录下来 首先看整个项目结构 从transaction.xml开始,虽然图上报错了,实际上运行并 ...
- [转] 对Array.prototype.slice.call()方法的理解
在看别人代码时,发现有这么个写法:[].slice.call(arguments, 0),这到底是什么意思呢? 1.基础 1)slice() 方法可从已有的数组中返回选定的元素. start:必需.规 ...
- java流程控制语句总结
1.选择结构 if 方式1: 格式: if(条件表达式) { 语句体; } 执行流程: 如果条件表达式值为true, 执行语句体 如果条件表达式值为false,不执行语句体 方式2: 格式: if(条 ...
- mysql特殊使用
1.按照 job 和薪水倒序排序: select ename,job,sal from emp order by job desc,sal desc; 2.substr()截取子串 该函数接收3个参数 ...
- MyEclipse 安装插件 Github安装/使用 教程
2016年02月18日 09:45:23 阅读数:4531 本文的目的是 1.在 Myeclipse10.7中 集成Github并使用. 选择的安装方式是:MyEclipse 中设置下文中1后,下载g ...