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

  考虑用容斥,实际上就是让 \(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. php_package v2.7发布了 宋正河作品

    php_package 是一个面向过程的底层开发框架 http://download.csdn.net/download/songzhengdong82/4974123 欢迎大家下载

  2. 前端常见算法面试题之 - 从尾到头打印链表[JavaScript解法]

    题目描述 输入一个链表的头结点,从尾到头反过来打印出每个结点的值 实现思路 前端工程师看到这个题目,直接想到的就是,写个while循环来遍历链表,在循环中把节点的值存储在数组中,最后在把数组倒序后,遍 ...

  3. leetcode刷题笔记191 位1的个数

    题目描述: 编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量). 示例: 输入: 输出: 解释: 32位整数 的二进制表示为 . 题目分析: 判断3 ...

  4. lspci命令详解

    基础命令学习目录首页 最近经常用到 lspci -nn | grep Eth 命令,需要学习下PCI总线,找到一篇文章,虽然也是转载,但写的较清晰,再次转载下. http://blog.csdn.ne ...

  5. python的Socket网络编程 使用模板

    本文给出的是TCP协议的Socket编程. 其中用了一个dbmanager数据库操作模块,这个模块是我自己定义的,可以在我的另一个文章中找到这个模块的分享.python操作mysql数据库的精美实用模 ...

  6. 定时任务crone表达式demo

    1. cron表达式格式: {秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)} 2. cron表达式各占位符解释: {秒数} ==> 允许值范围: 0~59 ,不允许 ...

  7. 快速删除docker中的容器

    http://blog.csdn.net/cmzsteven/article/details/49230363

  8. 2017秋软工 - 本周PSP

    1. PSP 2. PSP饼状图 3. 进度条 4. 累计进度图

  9. 【数据预处理】TIMIT语料库WAV文件转换

    1 问题描述 这两天复现代码.先构造数据集,纯净语音.不同噪声.不同SNR的混合语音.其中纯净语音由两部分组成,IEEE corpus和TIMIT. 一开始我用MATLAB中的audioread读取音 ...

  10. java的(PO,VO,TO,BO,DAO,POJO)类名包名解释

    VO:值对象.视图对象 PO:持久对象 QO:查询对象 DAO:数据访问对象——同时还有DAO模式 DTO:数据传输对象——同时还有DTO模式 PO:全称是persistant object持久对象最 ...