题目大意

  给定一个集合 \(\{1,2,\ldots,n\}\),要求你从中选出 \(m\) 个数,且这 \(m\) 个数的和是 \(k\)。问方案数 \(\bmod 998244353\)

  \(0\leq k<n<998244353,m\leq n\)

题解

  先不考虑选的数的个数的限制。

  显然答案的 OGF 为

\[F(x)=\prod_{i=0}^{n-1}(1+x^i)
\]

  考虑答案的式子

\[\begin{align}
ans&=\frac{1}{n}\sum_{i=0}^{n-1}F(\omega_n^i)\omega_n^{-ik}\\
&=\frac{1}{n}\sum_{i=0}^{n-1}\prod_{j=0}^{n-1}(1+\omega_n^{ij})\omega_n^{-ik}
\end{align}
\]

  记 \(d=\gcd(n,i)\),那么

\[\begin{align}
ans&=\frac{1}{n}\sum_{i=0}^{n-1}\prod_{j=0}^{n-1}(1+\omega_n^{ij})\omega_n^{-ik}\\
&=\frac{1}{n}\sum_{i=0}^{n-1}\prod_{j=0}^{\frac{n}{d}-1}{(1+\omega_\frac{n}{d}^{ij})}^d\omega_n^{-ik}\\
\end{align}
\]

  容易发现,\(\prod_{i=0}^{n-1}(1+\omega_n^i)=1-{(-1)}^n\)

\[\begin{align}
ans&=\frac{1}{n}\sum_{i=0}^{n-1}\prod_{j=0}^{\frac{n}{d}-1}{(1+\omega_\frac{n}{d}^{ij})}^d\omega_n^{-ik}\\
&=\frac{1}{n}\sum_{i=0}^{n-1}{(\prod_{j=0}^{\frac{n}{d}-1}{(1+\omega_\frac{n}{d}^{ij})})}^d\omega_n^{-ik}\\
&=\frac{1}{n}\sum_{i=0}^{n-1}{(1-{(-1)}^\frac{n}{d})}^d\omega_n^{-ik}\\
&=\frac{1}{n}\sum_{d\mid n}{(1-{(-1)}^\frac{n}{d})}^d(\sum_{\gcd(i,n)=d}\omega_n^{-ik})\\
&=\frac{1}{n}\sum_{d\mid n}{(1-{(-1)}^\frac{n}{d})}^d(\sum_{\gcd(i,\frac{n}{d})=1}\omega_\frac{n}{d}^{-ik})\\
&=\frac{1}{n}\sum_{d\mid n}{(1-{(-1)}^\frac{n}{d})}^d(\sum_{j\mid \frac{n}{d}}\mu(j)\sum_{i=0}^{\frac{n}{dj}-1}\omega_\frac{n}{dj}^{-ik})\\
&=\frac{1}{n}\sum_{d\mid n}{(1-{(-1)}^\frac{n}{d})}^d(\sum_{j\mid \frac{n}{d}}\mu(j)[\frac{n}{dj}\mid k]\frac{n}{dj})\\
\end{align}
\]

  现在要加上 \(m\) 这个限制,只需要多加一个元 \(y\),把初始的 OGF 改为

\[\prod_{i=0}^{n-1}(1+x^iy)
\]

  推导过程中把 \(y\) 当做一个常量,就像 \(x\) 一样。最后的式子为

\[[y^m]\frac{1}{n}\sum_{d\mid n}{(1-{(-y)}^\frac{n}{d})}^d(\sum_{j\mid \frac{n}{d}}\mu(j)[\frac{n}{dj}\mid k]\frac{n}{dj})\\
\]

  还有一个问题就是要在二项式展开的时候计算组合数。直接分段打表就好了。

  时间复杂度:\(O(\sigma_0(n)^2)\)。

代码

  阶乘的表删掉了。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<assert.h>
using namespace std;
typedef long long ll;
const ll p=998244353;
ll fp(ll a,ll b)
{
ll s=1;
for(;b;b>>=1,a=a*a%p)
if(b&1)
s=s*a%p;
return s;
}
int n,m,k;
ll getmiu(int x)
{
ll s=1;
for(int i=2;i*i<=x;i++)
if(x%i==0)
{
int tmp=0;
while(x%i==0)
{
tmp++;
x/=i;
}
if(tmp>=2)
return 0;
s=-s;
}
if(x!=1)
s=-s;
return s;
}
int c[1];
const int N=10000000;
const int D=200000;
int fac[N+10];
ll factorial(int n)
{
if(n<=N)
return fac[n];
ll s=c[n/D];
for(int i=n/D*D+1;i<=n;i++)
s=s*i%p;
return s;
}
ll binom(int x,int y)
{
return x>=y&&y>=0?factorial(x)*fp(factorial(y)*factorial(x-y)%p,p-2)%p:0;
}
void init()
{
fac[0]=1;
for(int i=1;i<=N;i++)
fac[i]=(ll)fac[i-1]*i%p;
}
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
int exgcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=1;
y=0;
return a;
}
int d=exgcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
int get(int a)
{
int x,y;
int d=exgcd(a,p-1,x,y);
if(x<0)
{
printf("%d %d\n%lld\n",x,y,(ll)x*a+y*(p-1));
x+=(p-1)/d;
y-=a/d;
printf("%d %d\n%lld\n\n",x,y,(ll)x*a+y*(p-1));
}
return x;
}
ll mu[10000];
int d[10000];
int t=0;
int query(int x)
{
return mu[lower_bound(d+1,d+t+1,x)-d];
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
#endif
init();
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i*i<=n;i++)
if(n%i==0)
{
d[++t]=i;
if(i*i!=n)
d[++t]=n/i;
}
sort(d+1,d+t+1);
for(int i=1;i<=t;i++)
mu[i]=getmiu(d[i]);
ll ans=0;
for(int i=1;i<=t;i++)
{
if(m%(n/d[i]))
continue;
int w=m/(n/d[i]);
int v=(w&1?-((n/d[i])&1?-1:1):1);
ll s1=binom(d[i],w);
ll s2=0;
for(int j=1;j<=t;j++)
if((n/d[i])%d[j]==0)
if(k%(n/d[i]/d[j])==0)
s2=(s2+mu[j]*n/d[i]/d[j])%p;
ans=(ans+s1*s2*v)%p;
}
ans=ans*fp(n,p-2)%p;
ans=(ans+p)%p;
printf("%lld\n",ans);
return 0;
}

【XSY3147】子集计数 DFT 组合数学的更多相关文章

  1. BZOJ_4517_[Sdoi2016]排列计数_组合数学

    BZOJ_4517_[Sdoi2016]排列计数_组合数学 Description 求有多少种长度为 n 的序列 A,满足以下条件: 1 ~ n 这 n 个数在序列中各出现了一次 若第 i 个数 A[ ...

  2. 【BZOJ2425】[HAOI2010]计数(组合数学)

    [BZOJ2425][HAOI2010]计数(组合数学) 题面 BZOJ 洛谷 题解 很容易的一道题目. 统计一下每个数位出现的次数,然后从前往后依次枚举每一位,表示前面都已经卡在了范围内,从这一位开 ...

  3. 【BZOJ2111】[ZJOI2010]排列计数(组合数学)

    [BZOJ2111][ZJOI2010]排列计数(组合数学) 题面 BZOJ 洛谷 题解 就是今年九省联考\(D1T2\)的弱化版? 直接递归组合数算就好了. 注意一下模数可以小于\(n\),所以要存 ...

  4. [BZOJ2839]:集合计数(组合数学+容斥)

    题目传送门 题目描述 .(是质数喔~) 输入格式 一行两个整数N,K. 输出格式 一行为答案. 样例 样例输入: 3 2 样例输出: 样例说明 假设原集合为{A,B,C} 则满足条件的方案为:{AB, ...

  5. 2018.10.25 bzoj4517: [Sdoi2016]排列计数(组合数学)

    传送门 组合数学简单题. Ans=(nm)∗1Ans=\binom {n} {m}*1Ans=(mn​)∗1~(n−m)(n-m)(n−m)的错排数. 前面的直接线性筛逆元求. 后面的错排数递推式本蒟 ...

  6. [BZOJ2111]:[ZJOI2010]Perm 排列计数(组合数学)

    题目传送门 题目描述 称一个1,2,...,N的排列${P}_{1}$,${P}_{2}$,...,${P}_{N}$是Magic的,当且仅当2≤i≤N时,${P}_{i}$>${P}_{\fr ...

  7. 2018.10.25 atcoder Leftmost Ball(计数dp+组合数学)

    传送门 dp妙题啊. 我认为DZYODZYODZYO已经说的很好了. 强制规定球的排序方式. 然后就变成了一个求拓扑序数量的问题. 代码: #include<bits/stdc++.h> ...

  8. [HAOI2010]计数(组合数学)(数位DP)

    原题题意也就是给的数的全排列小于原数的个数. 我们可以很容易的想到重复元素的排列个数的公式. 但是我们发现阶乘的话很快就会爆long long啊(如果您想写高精请便) 之后我就尝试质因数分解....但 ...

  9. AT2000 Leftmost Ball(计数dp+组合数学)

    传送门 解题思路 设\(f[i][j]\)表示填了\(i\)个白色,\(j\)种彩色的方案数,那么显然\(j<=i\).考虑这个的转移,首先可以填一个白色,就是\(f[i][j]=f[i-1][ ...

随机推荐

  1. ArcGIS 10.0发布缓存地图服务(详细版)

    1.软件准备ArcGIS Destop10.0,ArcGIS Server10.0,Windows系统下自带的IIS6.0以上服务器 1)安装ArcGIS Destop10.0软件,选择完全安装,安装 ...

  2. iOS----------常见宏定义

    在我们日常的项目中,合理的使用宏定义,会大大减少我们的代码量,以及代码的可读性,为方便读者使用,总结如下: pragma mark - Application相关 ///=============== ...

  3. Github:failed to add file / to index

    我把Test项目上传到github上,为了截一部分图,来写博客.所以我就上传成功之后,把仓库Respository Test删除了,但是当我再次上传的时候,发现上传不上,会提示failed to ad ...

  4. Android为TV端助力 UDP协议

    废话不多说.直接上代码! 一. 接收端 1.创建UDP连接 public void init() { try { //开关的作用 isRunning = true; DatagramSocket mU ...

  5. IE8环境下的上传图片预览

    今天做一个需要在IE浏览器上使用的信息录入项目,遇到了图片上传预览的问题,找了一些资料,最后使用了IE自带的滤镜做到了 <!--HTML IE8不支持opacity,只能使用双层,一层背景半透明 ...

  6. Dijango学习_01_pycharm创建应用

    一.当初在学dijango的时候,网上的教程非常的杂且多,对于؏؏☝ᖗ乛◡乛ᖘ☝؏؏我们这种初入虎门的小白来说有太多误区 (其实是大佬的操作着实对小白不太友好,原谅我个萌新..2333..) 二.pi ...

  7. 一个小错误:error LNK2019: 无法解析的外部符号 "public: __thiscall Turtle::~Turtle(void)" (??1Turtle@@QAE@XZ),该符号在函数 _main 中被引用

    昨天在撸代码的时候遇到了一个十分蛋疼的错误 : 错误: 1>3.obj : error LNK2019: 无法解析的外部符号 "public: __thiscall Turtle::~ ...

  8. linux vi粘贴格式易错乱

    对于一些冗长的代码完全可以粘贴的时候,vi粘贴所有格式全部错乱,完全无法阅读. 解决办法:esc进入命令行模式后,输入 :set paste,然后再i进入粘贴编辑模式,即可正常复制并保留原有格式-

  9. Spring-扫描注解原理,注解自动扫描原理分析

    注解自动扫描原理分析 在spring的配置文件中加入如下代码,spring便开启了自动扫描,那么它的底层到底是如何实现的呢? <context:component-scan base-packa ...

  10. 监控zookeeper

    [4ajr@db1 scripts]$ cat zookeeper_mode.sh #!/bin/bash mode=`echo srvr|nc 127.0.0.1 2181|awk '/Mode/{ ...