ACM训练周末总结—12月3日

来源:互联网 发布:富人国 知乎 编辑:程序博客网 时间:2024/05/17 22:18

         这个半周开始了组合数学专题的题目,只是《组合数学》还没看完。下面整理一下几道重要的题吧。

         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的个数)


原创粉丝点击