首页 > 其他分享 >[AGC036C] GP 2 题解

[AGC036C] GP 2 题解

时间:2023-09-09 16:44:43浏览次数:57  
标签:GP int 题解 AGC036C 3m sum now inv mod

洛谷题目链接
AT原题
考虑构造出来的序列 \(a\) 的特征,因为每次会给 \(a_i\) 加 \(1\),\(a_j\) 加 \(2\),所以每次操作后 \(\sum a_i\) 会加上 \(3\)。

所以有\(\sum a_i =3m\) 。

又因为每次操作只给一个数加 \(1\),所以每次操作要么给序列加入一个奇数,要么使原来的一个奇数变成偶数。

所以序列中的奇数个数设为 \(k\) 的奇偶性与 \(m\) 相同,即 \(k=\sum a_i\%2\),\(k\equiv m (mod\ 2)\)。

考虑枚举奇数个数 \(k\),假设这 \(k\) 个数一开始就各加上了 \(1\),然后把剩下的两次加 \(1\) 当成一次加 \(2\) 来看。

于是便只剩下 \(\frac{3m-k}{2}\) 次加 \(2\) 操作,便变成了把 \(\frac{3m-k}{2}\) 分成 \(n\) 个非负整数。

求把 \(p\) 个数分为 \(n\) 个非负整数的方案,就等于把 \(p+n\) 个数分为 \(n\) 个正整数。
考虑有一个全为 \(1\) 的,长度为 \(p+n\) 的数列,把其分割成 \(n\) 段,即可得到需要的 \(n\) 个正整数。
因为要分成 \(n\) 段,所以割 \(n-1\) 次,方案就是 \(C_{p+n-1}^{n-1}\) 种。

所以答案为 \(\sum_{k\equiv m(mod\ 2)}^{m} C_{n}^{i}\cdot C_{\frac{3m-k}{2}+n-1}^{n-1}\)。

但是这样还是不对,因为题目中说 \(i\ne j\),所以这个数列里的数不能出现大于 \(2m\) 的数。

但是大于 \(2m\) 的数最多也只有一个,把它减掉 \(2m+1\) 即可转换为把 \(m-1\) 分为 \(n\) 个非负整数。

方案数为 \(C_{n+m-2}^{m}\cdot n\),减掉它就可以了。

代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=998244353;
const int N=2e6+9;
int fac[N],inv[N];
int qpow(int a,int k)
{
    int now=1;
    while(k)
    {
        if(k&1) now=(now*a)%mod;
        a=(a*a)%mod;
        k>>=1;
    }
    return now;
}
int C(int a,int b)
{
    if(b>a)
    return 0;
    return (fac[a]*inv[b]%mod)*inv[a-b]%mod;
}
int n,m,ans;
signed main()
{
    fac[0]=1;
    for(int i=1;i<N;i++)
    {
        fac[i]=(fac[i-1]*i)%mod;
    }
    inv[N-1]=qpow(fac[N-1],mod-2);
    for(int i=N-1;i>=1;i--)
    inv[i-1]=(inv[i]*i)%mod;
    cin>>n>>m;
    for(int i=m%2;i<=m;i+=2)
    {
        ans=(ans+C(n,i)*C((3*m-i)/2+n-1,n-1)%mod)%mod;
    }
    ans=((ans-n*C(n+m-2,n-1)%mod)%mod+mod)%mod;
    cout<<ans;
    return 0;
}

标签:GP,int,题解,AGC036C,3m,sum,now,inv,mod
From: https://www.cnblogs.com/tx-Elysia/p/17689719.html

相关文章

  • [题解] CF29D Ant on the Tree
    CF29DAntontheTree题目知识点:LCA。题目传送门题意给定一棵以\(1\)为节点的树,再给定树的所有叶子节点的一个序列。现在执行一个操作:从\(1\)开始遍历每个节点,并返回根,要求每条边经过的次数一定为\(2\)。问是否能够使得访问节点序列中叶子节点的序列符合给定序列的条......
  • P2206题解
    题目大意:给定一些指令,计算需要多大的舞台。这是一道大模拟!!!只要遍历每次指令,然后判断是否摔倒,摔倒输出`-1`否则记录,最后求出面积就行了。最后附上代码1#include<bits/stdc++.h>2usingnamespacestd;3constintxx[]={-1,0,1,0},yy[]={0,1,0,-1};//不同......
  • CDGP|数据治理对企业的转变有哪些?
    随着数字化转型的不断推进,数据已经成为企业的重要资产之一。数据治理作为数据管理的一个重要方面,对于企业的转变产生了深远的影响。本文将探讨数据治理如何改变企业。数据治理是指对数据进行规范、标准和安全的管理过程。通过数据治理,企业可以更好地管理和利用数据,提高数据的质量和......
  • CF1513C题解
    一道递推由于对于一个数x,可得x+10-x=10(废话)于是问题就变成了0+m次,然后x+m就变成0+x+m(还是废话)于是可以写一个递推。首先对于函数f(m)可分为m ≤9和m>9,然后可得出递推式结果为1或f(m-9)+f(m-10),所以我们可以直接求出结果再分解数位求值。最后贴上代码......
  • P2203题解
    题意给定一个环形01序列,每次变化时,对于每个位置,如果前一个值是1,则当前值翻转。求变化B次后的序列。思路由于B的值很大,所以如果对每一次变化进行模拟,效率非常低下。不难发现,每一次变化后的状态完全是由当前状态决定的,而N的范围很小,所以可能的状态总数2^N也不是很大......
  • CF812B题解
    康了康唯一的题解,说没必要用DP,我就给出DP的解法。这其实是道水题,唯一的坑是有可能楼上没有开的灯,坑了我们机房的一堆人(WAontest4),剩下的就是DP。我们用a[n][0],表示第n层的第一个房间,用a[n][1],表示第n层的最后一个房间。这里提供一个收集型的写法。所以可得状态转移......
  • CF1690E题解
    ##主要题意:有$n$个礼物,要两两合并,然后除以$k$最后求和最大。##思路:先加入每个数除以$k$的商(单独组成$k$的个数),然后全部$\bmod\k$存入数组,排序,最后双指针一个前一个后求两个余数可以大于等于$k$的两个礼物。##代码:```cpp#include<bits/stdc++.h>usingname......
  • CF1690C题解
    ##主要题意:>有$n$个任务,必须在$s_i$到$t_i$之间完成,求每个任务最大可以完成多久(优先前面的最大)。##思路>就拿一个变量记录当前时间,然后贪心选择$a[i].t$和$a[i+1].t$中的最小值,(应为至少也要给下一个任务留$1$的时间),最后做减法,输出即可。##代码>```cpp>#incl......
  • tensorflow选择cpu/gpu训练
    http://www.taodudu.cc/news/show-3980798.html?action=onClick通过环境变量控制屏蔽GPUexportCUDA_VISIBLE_DEVICES=""通过训练代码控制https://blog.csdn.net/dream_to_dream/article/details/122249872选择CPU:importosos.environ["CUDA_DEVICE_ORDER"]="......
  • pytest运行警告问题解决:DeprecationWarning: pkg_resources is deprecated as an API
    前言最近在运行pytest的时候,经常出现这个警告DeprecationWarning:pkg_resourcesisdeprecatedasanAPISeehttps://setuptools.pypa.io/en/latest/pkg_resources.htmlfrompkg_resourcesimportiter_entry_points从警告上看是方法被弃用,肯定是因为新版弃用了旧版的语法。......