容斥大法妙~其实网上很多的题解虽然给出了容斥系数,但是并没有说明为什么是这个样子的。在这里解释一下好了。

  考虑用容斥,实际上就是让 \(ans = \sum_{T\subseteq S}^{\ }f_{T}*h_{T}\)。其中,\(f\) 为容斥的系数,而 \(h\) 为一个集合的‘贡献’。这个贡献的值往往对于集合当中的各个元素而言是独立的。由于这题中是要我们求出所有的被操作了奇数次的灯的数量,所以有:

\(g_{x}=\sum_{i = 1}^{x}\binom{x}{i}*f_{i}=[x\&1]\)

\(g_{x}\) 为是原数列中 \(x\) 个数的倍数的数所对答案产生的贡献

令\(f[0] = 0\),

则\(g_{x}=\sum_{i = 0}^{x}\binom{x}{i}*f_{i}=[x\&1]\)

那么根据二项式反演,有

\(f_x = \sum_{i = 0}^{x} g_i * \binom{x}{i}*(-1)^{x - i}\)

\(f_x = \sum_{i = 0}^{x}\binom{x}{i}*(-1)^{x - i}[x\&1]\)

根据\(f_x = \sum_{i = 0}^{x}\binom{x}{i}*(-1)^{x - i}[x\&1]\)

对\(x\) 的奇偶性分类讨论一下,再加上:

\(\binom{n}{1}+\binom{n}{3}+\binom{n}{5}...=2^{n - 1}\)

(这个式子就不用解释了吧……)

然后就得到了\(f_x\) 的表达式~

  下面这份代码为 \(n^{2}\) 求出容斥系数,但实际上可以按照上文所说做到\(O(1)\)……

#include <bits/stdc++.h>
using namespace std;
#define maxn 1000
#define int long long
int n, m, ans, cnt, S[maxn];
int f[maxn], a[maxn], C[maxn][maxn]; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void Pre()
{
for(int i = ; i < ; i ++) C[i][] = ;
for(int i = ; i < ; i ++)
for(int j = ; j < ; j ++)
C[i][j] = C[i - ][j - ] + C[i - ][j];
} int Get(int x)
{
int t = x & ;
for(int i = ; i < x; i ++)
t -= C[x][i] * f[i];
return t;
} int gcd(int a, int b)
{
int c = ;
while(b) c = a % b, a = b, b = c;
return a;
} void dfs(int now)
{
if(now == m + )
{
int lcm = ;
for(int i = ; i <= cnt; i ++)
lcm = lcm * S[i] / gcd(lcm, S[i]);
ans += f[cnt] * (n / lcm);
return;
}
S[++ cnt] = a[now]; dfs(now + );
cnt --; dfs(now + );
} signed main()
{
int T = read(); f[] = ; f[] = ; Pre();
for(int i = ; i <= ; i ++) f[i] = Get(i);
for(int i = ; i <= T; i ++)
{
n = read(), m = read(); ans = ;
for(int j = ; j <= m; j ++) a[j] = read();
dfs();
printf("%lld\n", ans);
}
return ;
}

【题解】玲珑杯河南专场17B的更多相关文章

  1. “玲珑杯”线上赛 Round #17 河南专场

    闲来无事呆在寝室打打题,没有想到还有中奖这种操作,超开心的 玲珑杯”线上赛 Round #17 河南专场 Start Time:2017-06-24 12:00:00 End Time:2017-06 ...

  2. “玲珑杯”线上赛 Round #17 河南专场 B:震惊,99%+的中国人都会算错的问题(容斥计算)

    传送门 题意 略 分析 是一道稍微变形的容斥题目,容斥一般的公式 \[ans=\sum_iAi-\sum_{i<j}{Ai∩Aj}+\sum_{i<j<k}{Ai∩Aj∩Ak}+.. ...

  3. “玲珑杯”线上赛 Round #17 河南专场 A: Sin your life(和化积公式)

    传送门 题意 略 分析 首先将sin(x)+sin(y)+sin(z)h转化成\(2*sin(\frac{x+y}2)*cos(\frac{x-y}2)+sin(z)\),而cos(z)=cos(-z ...

  4. 玲珑oj 1128 RMQ模板

    1128 - 咸鱼拷问 Time Limit:3s Memory Limit:128MByte Submissions:380Solved:118 DESCRIPTION 给你两个序列A,B.每个序列 ...

  5. 玲珑oj 1129 ST

    1129 - 喵哈哈村的战斗魔法师丶坏坏い月 Time Limit:3s Memory Limit:256MByte Submissions:490Solved:107 DESCRIPTION 坏坏い ...

  6. GOOD BYE OI

    大米饼正式退役了,OI给我带来很多东西 我会的数学知识基本都在下面了 博客园的评论区问题如果我看到了应该是会尽力回答的... 这也是我作为一个OIer最后一次讲课的讲稿 20190731 多项式乘法 ...

  7. “玲珑杯”ACM比赛 Round #12题解&源码

    我能说我比较傻么!就只能做一道签到题,没办法,我就先写下A题的题解&源码吧,日后补上剩余题的题解&源码吧!                                     A ...

  8. “玲珑杯”ACM比赛 Round #19题解&源码【A,规律,B,二分,C,牛顿迭代法,D,平衡树,E,概率dp】

    A -- simple math problem Time Limit:2s Memory Limit:128MByte Submissions:1599Solved:270 SAMPLE INPUT ...

  9. “玲珑杯”ACM比赛 Round #1 题解

    A:DESCRIPTION Eric has an array of integers a1,a2,...,ana1,a2,...,an. Every time, he can choose a co ...

随机推荐

  1. 零基础学python之函数与模块(附详细的代码和安装发布文件过程)

    代码重用——函数与模块 摘要:构建函数,创建模块,安装发布文件,安装pytest和PEP 8插件,确认PEP8兼容性以及纠错 重用代码是构建一个可维护系统的关键. 代码组是Python中对块的叫法. ...

  2. 零基础学python之入门和列表数据(附详细的代码解释和执行结果截图)

    Python学习笔记 1 快速入门 下载安装好Python之后,在开始找到 双击打开一个窗口,这是一个shell界面编辑窗口,点击左上角的file——new file新建一个窗口,这里可以输入完整的代 ...

  3. CSS基础范例

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. CF100015C

    主要找到环上任意一条边,有比较dis(u,v),dis(u,a)+w+dis(b,v),dis(u,b)+w+dis(a,u) 然后,然后没了 lca求dis(u,v):dis(u,v)=dis[u] ...

  5. RabbitMQ和Kafka,更加便捷高效的消息队列使用方式,请放心食用

    一.RabbitMQ实例介绍RabbitMQ实例由华为云分布式消息服务(DMS)团队打造,实例采用物理隔离的方式部署,租户独占RabbitMQ实例.一键式部署,完全兼容开源RabbitMQ的使用方式, ...

  6. go vendor 安装失败的原因分析

    安装之前的配置 export GOPATH=$HOME/go export PATH=$PATH:$GOPATH/bin 1 2 安装 通常,我们查到的安装方法一般是下面这种 go get -u gi ...

  7. sublime c/c++ 环境

    sublime c/c++ 环境 参考: 别人的教程1 别人的教程2 注意,一定要用cmd先试一下,编译成功后再用sublime试 我遇到了一个很诡异的问题,就是cmd运行正常但sublime显示 在 ...

  8. 如何知道一个App的包名呢

    包名(Package name)是Android系统中判断一个APP的唯一标识 记录我获取包名的几种方式 方法一:通过cmd命令,打开你要获取包名的APP 1.adb shell 2.dumpsys ...

  9. 初涉JSP+JDBC 基于SQL2008的登陆验证程序

    简单的以代码的形式纪念一下,因为现在还没有解决SQL2008驱动的问题,并且有好多东西要学,所以日后会有更新~ 所安装的软件有:SQL2008,eclipse,tomcat,JDK,涉及环境配置.等等 ...

  10. JTS

    在这个系列的 第 1 部分,我们讨论了事务并研究了它们的基本属性 ― 原子性(atomicity).一致性(consistency).孤立性(isolation)和持久性(durability).事务 ...