A - Character Encoding HDU - 6397 - 方程整数解-容斥原理

A - Character Encoding

HDU - 6397

思路 :

隔板法就是在n个元素间的(n-1)个空中插入k-1个板,可以把n个元素分成k组的方法

普通隔板法
 求方程 x+y+z=10的正整数解的个数。

添元素隔板法
 求方程 x+y+z=10的非负整数解的个数。 那么 增加 3 即转化为 了普通隔板法

但是这个题呢 还有 < N 的限制 ,那么就需要去除掉  ,分出的块中 有 > = n 的情况 。

就会 有 一块 出现 > =n ,两块 > =n 等等。。 具体 需要根据总数来确定 ,要去除这些情况贡献的解

发现  如果 有某一块 > = n 那么就转化为了 先把n个  放到 某一块上 ,剩下的 总数 - n  再 进行 分为 m块的 分配,

计算式即为 。 某一块     *    (剩下的 分到 m块上) 但是这样会多减去一些,因为 这些情况中包含了

有 两块  > = n 三块 > =n 等等 。所以 需要 加回来 两块的情况,

#include<bits/stdc++.h>
using namespace std;
#define maxn 234567
#define ll long long
#define mod 998244353
ll n,m,k,inv[maxn+10],A[maxn+10],ans,t;
ll qpow(ll a,ll b)
{
    ll re=1;
    while(b)
    {
        if(b%2)
            re=(re*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return re;
}
void init()
{
    A[0]=inv[0]=1;
    for(int i=1; i<=maxn; i++)
    {
        A[i]=(A[i-1]*i)%mod;
        inv[i]=qpow(A[i],mod-2)%mod;
    }
}
ll C(ll a,ll b)
{
    if(b<a)return 0;
    return (A[b]*inv[a]%mod*inv[b-a])%mod;
}
int main()
{
    init();
    scanf("%lld",&t);
    while(t--)
    {
        ans=0;
        scanf("%lld%lld%lld",&n,&m,&k);
        if(k==0)printf("1\n");
        else if(k>m*(n-1))printf("0\n");
        else if(k<n) printf("%lld\n",C(m-1,m+k-1));
        else
        {
            ll x=-1;
            ans=C(m-1,m+k-1);
            for(int i=1; i<=m; i++)
            {
                ans=(ans+C(i,m)*x%mod*C(m-1,k+m-1-i*n)%mod+mod)%mod;
                x*=-1;
            }
            printf("%lld\n",ans);
        }
    }
    return 0;
}

  

原文地址:https://www.cnblogs.com/SDUTNING/p/10261605.html

时间: 2024-11-13 06:43:08

A - Character Encoding HDU - 6397 - 方程整数解-容斥原理的相关文章

关于“Some characters cannot be mapped using &quot;GB2312&quot; character encoding. ”的问题

今天在做项目时,遇到了一个问题.因为是在别人做好的基础上改东西,所以,一些东西不能按照自己的变成习惯来.就比如,我创建项目习惯刚建完就设置字符的编码集为UTF-8,而人家的项目就未必是那样了.好了,废话不多了.问题如下:一个jsp页面(里面有Java代码)的编码集为GB2312,而我修改里面东西时死活不让我保存,一保存就提示"Some characters cannot be mapped using "GB2312" character encoding--".将

some characters cannot be mapped using iso-8859-1 character encoding

some characters cannot be mapped using iso-8859-1 character encoding some characters cannot be mapped using iso-8859-1 character encoding Eclipse中新建一个.properties文件,如果输入中文保存时就会提示错误 Reason: some characters cannot be mapped using "ISO-8859-1" chara

Character Encoding tomcat.

default character encoding of the request or response body: If a character encoding is not specified, the Servlet specification requires that an encoding of ISO-8859-1 is used. For JSP pages,The request character encoding handling is the same,for JSP

HDU 6397(2018多校第8场1001) Character Encoding 容斥

听了杜教的直播后知道了怎么做,有两种方法,一种构造函数(现在太菜了,听不懂,以后再补),一种容斥原理. 知识补充1:若x1,x2,.....xn均大于等于0,则x1+x2+...+xn=k的方案数是C(k+m-1,m-1)种(貌似紫书上有,记不太清了). 知识补充2:若限制条件为n(即x1,x2....xn均小于n,假设有c个违反,则把k减掉c个n(相当于把c个超过n的数也变成大于等于0的),就可以套用知识1的公式了. 则最后的答案为sum( (-1)^c * C(m , c) * C(m-1+

hdu (欧拉函数+容斥原理) GCD

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1695 看了别人的方法才会做 参考博客http://blog.csdn.net/shiren_Bod/article/details/5787722 题意 a,b,c,d,k五个数,a与c可看做恒为1,求在a到b中选一个数x,c到d中选一个数y,使得gcd(x,y)等于k,求x和y有多少对. 首先可以想到选取的必是k的倍数,假设是x和y倍,则x和y一定是互质的在,那么就变成了求1到b/k和1到d/k的之

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

HDU 4777 Rabbit Kingdom --容斥原理+树状数组

题意: 给一个数的序列,询问一些区间,问区间内与区间其他所有的数都互质的数有多少个. 解法: 直接搞有点难, 所谓正难则反,我们求区间内与其他随便某个数不互质的数有多少个,然后区间长度减去它就是答案了. 那么怎么求区间内与区间其他某个数不互质的数的个数(记为cnt)呢? 我们用L[i],R[i]表示在整个序列中左边与 i 最近的与 i 不互质的数的位置,R[i]表示右边的,L[i],R[i]我们可以正反扫一遍顺便分解因子,用个pos[]记录很方便地求出.那么区间内的cnt为L[i]或R[i]在区

hdu 4390 Number Sequence (容斥原理)

Number Sequence Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 790    Accepted Submission(s): 331 Problem Description Given a number sequence b1,b2-bn. Please count how many number sequences

HDU 5768 Lucky7 (容斥原理 + 中国剩余定理 + 状态压缩 + 带膜乘法)

题意:……应该不用我说了,看起来就很容斥原理,很中国剩余定理…… 方法:因为题目中的n最大是15,使用状态压缩可以将所有的组合都举出来,然后再拆开成数组,进行中国剩余定理的运算,中国剩余定理能够求出同时满足余膜条件的最小整数x,x在(1,M)之间由唯一值,M是各个除数的乘积,所有符合条件的解为ans = x+k*M,可以知道在[1,R]这个区间内,有(M+R-x)/ M个k符合条件,然后在运算中为了防止溢出,所以使用了带膜乘法,就是将乘数转化为二进制,通过位移运算符,在中间过程中不断的取膜(看代