【容斥原理】CDOJ - 1544 - 当咸鱼也要按照基本法

众所周知zhu是一个大厨,zhu一直有自己独特的咸鱼制作技巧.

tang是一个咸鱼供应商,他告诉zhu在他那里面有NN条咸鱼(标号从1到N)可以被用来制作.

每条咸鱼都有一个咸鱼值KiKi,初始时所有KiKi都是00.

zhu是一个特别的人,他有MM个咸数(咸鱼数字), 对于每个咸数xx,他都会让所有满足标号是xx倍数的咸鱼的咸鱼值异或上11.

zhu现在想知道经过了这MM个咸数的筛选之后,最终有多少条的咸鱼的咸鱼值是11?

Input

输入的第一行包含一个整数TT,表示有TT组数据.

对于每组数据:

输入第一行只有两个整数NN,MM.

接下来一行有MM个整数,依次对应zhu的每个咸数.

数据保证:

  • 1≤T≤10001≤T≤1000
  • 1≤N≤1091≤N≤109
  • 1≤M≤151≤M≤15
  • 1≤咸数≤2?1051≤咸数≤2?105

Output

对于每组数据,输出一行表示答案

Sample Input


10 2 
5 8




10 1 

10 1 
1

Sample Output

3




10

Hint

Prepared by xiper

容斥原理,只统计奇数集合覆盖的元素个数,假设m=3,答案等于A+B+C-2AB-2AC-2BC+4ABC……以此类推,每层的系数乘以2。自己瞎几把推一下就行。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
typedef long long ll;
ll lcm(ll a,ll b)
{
	return a/__gcd(a,b)*b;
}
int T,n,m,a[21];
ll lcms[33000];
void inidfs(int cur,int S,ll now)
{
	lcms[S]=now;
	if(cur==m)
	  return;
	ll t=lcm(now,(ll)a[cur+1]);
	if(t<=(ll)n)
	  inidfs(cur+1,S|(1<<cur),t);
	inidfs(cur+1,S,now);
}
ll ans;
void dfs(int cur,int dep,int S)
{
	if(cur>m)
	  return;
	ans+=(lcms[S]==0 ? 0 : (1ll<<(dep-1))*(dep%2==0 ? (-1ll) : 1ll)*((ll)n/lcms[S]));
	for(int i=cur+1;i<=m;++i)
	  dfs(i,dep+1,S|(1<<(i-1)));
}
int main()
{
	scanf("%d",&T);
	for(;T;--T)
	  {
	  	ans=0;
	  	memset(lcms,0,sizeof(lcms));
	  	scanf("%d%d",&n,&m);
	  	for(int i=1;i<=m;++i)
	  	  scanf("%d",&a[i]);
	  	inidfs(0,0,1);
	  	lcms[0]=0;
	  	dfs(0,0,0);
	  	cout<<ans<<endl;
	  }
	return 0;
}

众所周知zhu是一个大厨,zhu一直有自己独特的咸鱼制作技巧.

tang是一个咸鱼供应商,他告诉zhu在他那里面有NN条咸鱼(标号从1到N)可以被用来制作.

每条咸鱼都有一个咸鱼值KiKi,初始时所有KiKi都是00.

zhu是一个特别的人,他有MM个咸数(咸鱼数字), 对于每个咸数xx,他都会让所有满足标号是xx倍数的咸鱼的咸鱼值异或上11.

zhu现在想知道经过了这MM个咸数的筛选之后,最终有多少条的咸鱼的咸鱼值是11?

Input

输入的第一行包含一个整数TT,表示有TT组数据.

对于每组数据:

输入第一行只有两个整数NN,MM.

接下来一行有MM个整数,依次对应zhu的每个咸数.

数据保证:

  • 1≤T≤10001≤T≤1000
  • 1≤N≤1091≤N≤109
  • 1≤M≤151≤M≤15
  • 1≤咸数≤2?1051≤咸数≤2?105

Output

对于每组数据,输出一行表示答案

Sample Input


10 2 
5 8




10 1 

10 1 
1

Sample Output

3




10

Hint

Prepared by xiper

时间: 2024-12-18 03:59:08

【容斥原理】CDOJ - 1544 - 当咸鱼也要按照基本法的相关文章

UESTC - 1544 当咸鱼也要按照基本法 组合数学 容斥原理

http://acm.uestc.edu.cn/#/problem/show/1544 考虑一下2.2.2这样的情况.答案应该是n / 2 如果只选一个的情况下,对答案的贡献是正的,但是这里有三个,也就是我们统计了3 * n / 2,统计多了. 那么对于任选两个数的情况,有三种,(2, 2) * 3,分别都是不同位置的2, /**************************************/ 我做的时候是发现,先讨论只有 2.2的情况,也就是只有两个数的时候,ans = 0,这个时候

CDOJ-2016-A-柱爷与咸鱼神功

某日,喵哈哈村,柱爷在自己房间内,面对魔镜 "魔镜啊,魔镜,什么才是这个世界上最强大的武功?" 霎时,一道惊雷落下,柱爷的面前竟然浮现出了一本古老的黑色书籍,而书的名字竟然是"咸鱼神功" ! 翻开一看,书的第一页赫然写着:"练至大成可变身咸鱼王,掌控雷电! " 看到这句话,柱爷当即决定修炼咸鱼神功! 既然是神功,也不是那么好练的,因此柱爷决定好好的规划一下自己的修炼过程! 柱爷有N N 点心情值,而咸鱼神功则有M M 个招式,对于每个招式,柱爷必

UVA 11014 - Make a Crystal(容斥原理)

UVA 11014 - Make a Crystal 题目链接 题意:给定一个NxNxN的正方体,求出最多能选几个整数点.使得随意两点PQ不会使PQO共线. 思路:利用容斥原理,设f(k)为点(x, y, z)三点都为k的倍数的点的个数(要扣掉一个原点O).那么全部点就是f(1),之后要去除掉共线的,就是扣掉f(2), f(3), f(5)..f(n).n为素数.由于这些素数中包括了合数的情况,而且这些点必定与f(1)除去这些点以外的点共线,所以扣掉.可是扣掉后会扣掉一些反复的.比方f(6)在f

BZOJ3198 SDOI2013 spring HASH+容斥原理

题意:给定6个长度为n的数列,求有多少个数对(i,j)((i,j)≡(j,i))使得i和j位置恰好有K个数相同,其中0≤K≤6 题解: 设fi=至少有K个数相同的位置对的数量,用2^6枚举每一种可能,根据容斥原理,答案就是\[\sum\limits_{i = K}^N {{f_i}C_i^K{{\left( { - 1} \right)}^{i - K}}} \] 至于多乘一个组合数,是因为当前枚举到有x个数相同,一个位置对有i个相同的数,那么累计的时候就会算成$C_x^i$,因此实际上这个位置

hdu 4790 Just Random 容斥原理+数学

Just Random Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1723    Accepted Submission(s): 483 Problem Description Coach Pang and Uncle Yang both love numbers. Every morning they play a game w

咸鱼的自我修养

第一部分:结缘计算机 一开始选择计算机专业是因为感觉这个专业很高大上,在现在的信息时代,如果懂的计算机的话,应该是一个很不错的技能,以后能够更好的养活自己.在计算机方面的话天赋谈不上,自己也没有很主动的去学习想要了解这个方面,以至于虽然大家都是差不多的成绩进来的大学在这两年过后,自己的惰性导致了和聪明的同学有了很明显的差距,和一些很厉害的博主相比亦是如此.但是也了解到了这些具体差距才能有更加大的动力来进步.对于软件开发,编程之类的也没有特别的热情使我来主动在课余时间阅读相关读物,进行这方面的课外

[BZOJ 1042] 硬币购物 容斥原理

题意 有四种货币, 它们的价值分别是 c[0], c[1], c[2], c[3] . n 次询问, 每次给定 d[0], d[1], d[2], d[3], s, 问凑出 s , 且第 i 种货币不超过 c[i] 个的方案数. c[i], d[i], s <= 100000 , n <= 1000 . 分析 设第 i 种货币取了 x[i] 个. 问题转化为求不定方程 c[0]x[0] + c[1]x[1] + c[2]x[2] + c[3]x[3] = s 的非负整数解的个数. 且满足 4

HDU - 4135 Co-prime(容斥原理)

Question 参考 题意找出[a,b]中与n互质的数的个数分析通常我们求1-n中与n互质的数的个数都是用欧拉函数.但如果n比较大或者是求1-m中与n互质的数的个数等等问题,要想时间效率高的话还是用容斥原理.先对n分解质因数,分别记录每个质因数, 那么所求区间内与某个质因数不互质的个数就是 m/r(i),假设r(i)是r的某个质因子 假设只有三个质因子, 总的不互质的个数应该为p1+p2+p3-p1*p2-p1*p3-p2*p3+p1*p2*p3. pi代表m/r(i),即与某个质因子不互质的

容斥原理

对容斥原理的描述 容斥原理是一种重要的组合数学方法,可以让你求解任意大小的集合,或者计算复合事件的概率. 描述 容斥原理可以描述如下: 要计算几个集合并集的大小,我们要先将所有单个集合的大小计算出来,然后减去所有两个集合相交的部分,再加回所有三个集合相交的部分,再减去所有四个集合相交的部分,依此类推,一直计算到所有集合相交的部分. 关于集合的原理公式 上述描述的公式形式可以表示如下:                  它可以写得更简洁一些,我们将B作为所有Ai的集合,那么容斥原理就变成了: 这个