首页 > 其他分享 >P3746 [六省联考 2017] 组合数问题

P3746 [六省联考 2017] 组合数问题

时间:2023-10-30 22:23:09浏览次数:35  
标签:nk 六省 int bmod 卷积 ik vector P3746 联考

看了题解才悟了,我还是太菜了。

solution

要求

\[\left( \sum_{i = 0}^\infty C_{nk}^{ik + r} \right) \bmod p \]

这个形式很像生成函数吧。我们套用生成函数:

\[G(x) = \sum_{i=0}^{\infty}\begin{pmatrix}nk \\ i\end{pmatrix}x^i \]

所求即为

\[\sum_{i \bmod k = r}[x^i](1 + x)^{nk} \]

这里有个小技巧:循环卷积。

我们卷积时,显然有:

\[x^{ik+r}x^{jk+l} \Rightarrow x^{(i+j+[l+r>k])k + (l+r) \bmod k} \]

\(ik+r\) 即模意义下为 \(r\),\(jk+l\) 即模意义下为 \(l\)。

我们发现他们两个的乘积放到 \(l + r \bmod k\) 了。

所以卷积时可以直接套模意义。

就是循环卷积。

然后初始化:

显然:初始时生成函数多项式为 \((1+x)\),即 \([x^0](1+x) = [x^1](1+x) = 1\)。

当 \(k=1\) 时较特殊,所有项放到 \([x^0]\) 了,所以为 \(2\)。

记得取模。

#include<bits/stdc++.h>
#define int long long
using namespace std;
int p,k;
vector<int> operator*(vector<int> a,vector<int> b)
{
    vector<int> res(k);
    for(int i=0;i<k;i++)
    {
        for(int j=0;j<k;j++)
        {
            res[(i + j) % k] = (res[(i + j) % k] + a[i] * b[j] % p) % p;
        }
    }
    return res;
}
vector<int> fpow(vector<int> a,int b)
{
    vector<int> r(k);
    r[0] = 1;
    while(b)
    {
        if(b & 1)r = r * a;
        a=a*a;
        b>>=1;
    }
    return r;
}
int n,r;
signed main()
{
    cin>>n>>p>>k>>r;
    vector<int> a(k);
    if(k == 1)a[0] = 2 % p;
    else a[0] = a[1] = 1;
    vector<int> ans(k);
    ans = fpow(a,n * k);
    cout<<ans[r];
    return 0;
}

标签:nk,六省,int,bmod,卷积,ik,vector,P3746,联考
From: https://www.cnblogs.com/2021cjx-akioi/p/17799024.html

相关文章

  • 省选联考 2022 填树
    洛谷传送门LOJ传送门这题做得真艰难。先考虑第一问。一眼看上去并没有什么复杂度脱离值域的办法。考虑枚举一个\(x\)表示最小值,那么点权只能在\([x,x+K]\)中。点权最小值不一定为\(x\),减去点权在\([x+1,x+K]\)中的答案即可,也就是把\(K\)减\(1\)后再算一......
  • P5289 [十二省联考 2019] 皮配
    很容易想到设\(dp_{i,j,k}\)表示考虑前\(i\)个阵营,\(C_0=j\),\(D_0=k\)时的方案数,层内转移时可以用辅助数组对两种阵营决策分别转移,此时时间复杂度为\(O(nM^2)\)。考虑\(k=0\)的情况,如果我们能做这个的话,\(k=30\)其实就是在暗示我们把特殊选手拆出来单独做。而如果所有选......
  • 【多校联考NOIP#3】比赛复盘 && 题解
    A.卡牌这次比赛,一道签到题都没有。本来以为是线段树上二分。就类似于花神的数论题那道,刚开始暴力修改(修改到线段树的每一个叶子节点),然后由于boss的attack在不断增加,到了\(Att_i>=hp_j\)的时候,\(j\)这个牌顶多打一次,如果一个区间的\(max\)都小于boss的攻击力了,那么就不......
  • 八点五省联考 2018
    一双木棋状态数不多,直接爆搜https://loj.ac/s/1676274IIIDX考虑依次给\(i=1,2,\cdots,n\)填上数,每次尽量填最大的。考虑什么时候\(i\)填上\(x\)是合法的。考虑Hall定理,发现左部点约束最严的时候肯定是找一个已经填过的点\(u\),然后对所有\(d_v\ged_u\)的\(v\),选出......
  • 联考test1009
    写在前面的话感觉比以往的比赛难多了。出题人卡高精度,不好评价,但是题目还是好题。考试的时候开题顺序为\(T1-T3-T4-T2\),感觉和题目的实际难度排序差不多。考试的时候懒了,没有去拼暴力,实际得分\(80+0+100+0=180\),总体排名\(rk29\)。\(T1\)题意简述我们知道,对于一个整......
  • 2023.09.26 联考总结&题解
    T1derby你考虑直接贪心进行匹配即可,就是说对于每一个\(1\)去匹配最大的\(0\)#include<bits/stdc++.h>usingnamespacestd;intn,m;vector<int>A[2],B[2];intmain(){ freopen("derby.in","r",stdin); freopen("derby.out","w",s......
  • Luogu P5290 [十二省联考 2019] 春节十二响
    LuoguP5290[十二省联考2019]春节十二响题目链接题目大意一颗有根树,有点权,把点分成若干个集合,要求每个集合内不包含祖先关系,求集合的最大值的和的最小值.做题思路考虑合并两个集合,我们只需要不停把分别吧两个集合的最大值取出取max加入答案,再把大集合剩下的内......
  • [DS记录] P6623 [省选联考 2020 A 卷] 树
    题目传送门\(\rmTrie\)树的一些牛逼应用异或和是可以用\(\rm01-Trie\)维护的。我们发现对于一个点\(x\),需要需要维护\(x\)子树的所有点的异或和,这可以理解成\(\rmTrie\)树的合并。同时有一个\(d(y,x)\)的存在,其实考虑\(\rmdfs\)的过程,相当于先合并所有子节点的......
  • [十二省联考 2019] 春节十二响
    题目链接。题意给出一棵有\(n\)个节点的树,要求你将集合\(\{1,2,\dots,n\}\)划分成若干个子集,使得没有子集拥有节点对满足两个元素在树上是祖孙关系。你需要最小化子集的最大值之和。先考虑带有启发性的子任务\(4\)(树是一颗链)。具体来说,树有以下两种形态:根节点是链的......
  • [九省联考 2018 D1T3] 秘密袭击
    考虑转化为求\(\gei\)的权值个数\(\gek\)的联通块数量。设\(f(u,i,j)\)表示\(u\)子树内含\(u\)联通块内权值\(\gei\)的有\(j\)个的方案数,\(g(u,i,j)\)维护子树的和,也就是最终答案。发现转移非常简单所以可以写成生成函数:\[F(u,i)=x^{[d_u\gei]}\prod_{(u,......