这个半周开始了组合数学专题的题目,只是《组合数学》还没看完。下面整理一下几道重要的题吧。
B题:给出n,k,求C(n,k),水题,但是注意乘的时候大头开始,除是从小头开始,保证没有小数出现。
ans=ans*(n-i+1)/i;
P题:(吃糖果)吃一种,下一次吃另一种,这样;可是Gardon不知道是否存在一种吃糖果的顺序使得他能把所有糖果都吃完?就是计算能不能通过排列让同一种糖果不相邻。这道题可以用插空的方法,先找出数量最多的一种糖果(设个数为n),找除了这种糖果其他种的糖果数量是否超过n-1,超过就Yes。因为可以按照插空来理解,只要多于n-1,就可以保证分开这最多的一种,而插入的糖果还扩充了可插入的空间。
Z题:T组 测试样例,n表示有n次询问,m表示模数。初始化X=1。每次询问有两个数x,y。
当x=1时,求当前的X乘以y的结果
当x=2,求当前的X除以第y次询问的y值(数据保证当x=2时,第y次询问对应的是一个1询问)
每次询问输出操作完后的X。
这道题是利用线段树维护区间乘积,因为x=2时除以第y次询问的y值,此时线段树就是维护一条时间线,维护第 i 次操作乘的数。初始化数组为1,x=2时将该点变为1。x=1是初始化为y。
F题(Game of Connections):给你2n个数,让这些数按照顺序围成一个圈,任意两个数可以连接,但是每个数只能连接一次,且连线不能交叉,问你一共有多少种方式。。。。。重点题
这是一道典型的卡特兰数,关于卡特兰数我找到一位大佬讲的易懂
F(n)=f(n-1)*(4*n-2)/(n+1);
还有 f(n)=C(2n,n)/(n+1);
或者 f(n)=c(2n,n)-c(2n,n+1);
http://blog.csdn.net/logzhangrui/article/details/43083549
还有https://www.cnblogs.com/gongxijun/p/3232682.html
E题(Happy 2006 ):给出n和k求出第k个与n互素的数。
gcd(b×t+a,b=gcd(a,b) (t为任意整数)。。。小本本
这道题可以理解为计算周期的,先找出<=m中与m互素的所有数,然后通过利用上面定理找到周期确定具体的数。
K题(How many integers can you find ):给定n和一个大小为m的集合,集合元素为非负整数。为1...n内能被集合里任意一个数整除的数字个数。
这是一道容斥原理的基本题。。。。重点题
公式
我就不过多解释了,很好理解。
ll gcd(ll x,ll y)
{
if(y==0) return x;
else return gcd(y,x%y);
}
ll a[30],ans,m,n,cnt;
void dfs(ll i,ll lcm,ll k)//递归形式
{
lcm=a[i]/gcd(lcm,a[i])*lcm;//算出最小公倍数
if(k%2==1)
{
ans=ans+n/lcm;//找1到n中有多少lcm,通过k判断是奇次还是偶次
}
else
{
ans=ans-n/lcm;
}
for(int j=i+1;j<=cnt;j++)
{
dfs(j,lcm,k+1);
}
}
D题(跳蚤):给出两个数n,m,就是n+1个数a[1],a[2],,,,a[n+1],其中a[n+1]=m,1<=a[ i ]<=m,且x1*a[1]+x2*a[2]+...+xn*a[n]+xn+1*a[n+1]=1。求多少种情况。其实就是找出有多少种排列使n+1个数最大公因子是1,总共有m^n种情况,在减去和m不互质的数的情况。还是容斥原理。首先找出m的所有公因数,然后公因数d的n元组,每个位置上有 (m/d)个选择(1 ~ m里面有m/d个d的倍数),根据乘法原理,可以得出有公因数d的n元组有 (m/d)^n 个。
Q题:给你一个数n,让你求C(n,0)、C(n,1)...C(n,n)这n+1个数中为奇数的个数。。。。重点题
Lucas定理:C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p。p是素数
因为这道题p是2,其实就是求C(n,0)%2+C(n,1)%2+...C(n,n)%2。
转载于:http://blog.csdn.net/yjx_xx/article/details/38071017
比如 n=1001101,m是从000000到1001101的枚举,我们知道在该定理中
C(0,1)=0,因此如果n=1001101的0对应位置的m二进制位为1那么C(n,m) % 2==0,因此m对应n为0的
位置只能填0,而1的位置填0,填1都是1(C(1,0)=C(1,1)=1),不影响结果为奇数,并且保证不会
出n的范围,因此所有的情况即是n中1位置对应m位置0,1的枚举,那么结果很明显就是:2^(n中1的个数)