【杂题】[LibreOJ #6608] 无意识的石子堆【容斥原理】【FFT】
Description
Solution
943718401=225*2^22+1
显然每行必须有两个,我们不妨枚举有k列有2个石子,那么有2(n-k)列有1个石子。
\]
抽象一下问题,我们有n种颜色的球,每种颜色的球有两个且没有区别,现在要将它们放进k+2(n-k)个有区别的盒子中,其中k个盒子无序的放2个球,2(n-k)个盒子放1个球,同种颜色的球不能放入同一个盒子,\(S_k\)就是方案数,我们只需要快速算出所有的\(S_k\)。
同种颜色的球不能放入同一个盒子的限制比较烦人,我们考虑容斥。
枚举有多少个盒子放了两个相同颜色的球。
从n种颜色选出i个颜色,k个盒子选出i个盒子,以某种顺序放置。
我们先假定同种颜色的两个球不同,k个盒子的两个球有序,最后再除掉。
剩下(2n-2i)!个球再以某种顺序填入盒子。
那么有
\]
这是一个卷积的形式,可以用FFT加速。
这样就只用了一次卷积就算出了答案。
时间复杂度\(O(n\log n)\)
Code
#include <bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fod(i,a,b) for(int i=a;i>=b;--i)
#define LL long long
using namespace std;
int M,L;
const int mo=943718401;
const int MAXM=4194304;
LL js[MAXM+1],ny[MAXM+1];
LL ksm(LL k,LL n)
{
LL s=1;
for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo;
return s;
}
namespace poly
{
int wi[MAXM+1],bit[MAXM+1],ns;
void init()
{
js[0]=1;
fo(i,1,M) js[i]=js[i-1]*i%mo,bit[i]=(bit[i>>1]>>1)|((i&1)<<(L-1));
ny[M]=ksm(js[M],mo-2);
fod(i,M-1,0) ny[i]=ny[i+1]*(i+1)%mo;
wi[0]=1;
wi[1]=ksm(7,(mo-1)/M);
fo(i,2,M) wi[i]=(LL)wi[i-1]*wi[1]%mo;
ns=ksm(M,mo-2);
}
void DFT(int *a)
{
int v;
fo(i,0,M-1) if(i<bit[i]) swap(a[i],a[bit[i]]);
for(int h=1;h<M;h<<=1)
{
int wn=wi[M/h/2];
for(int j=0;j<M;j+=h*2)
{
int *x=a+j,*y=x+h,w=1;
for(int i=0;i<h;i++,x++,y++,w=(LL)w*wn%mo)
{
v=(LL)*y * w%mo;
*y=(*x-v+mo)%mo;
*x=(*x+v)%mo;
}
}
}
}
void IDFT(int *a)
{
DFT(a);
fo(i,0,M-1) a[i]=(LL)a[i]*ns%mo;
reverse(a+1,a+M);
}
}
using poly::init;
using poly::DFT;
using poly::IDFT;
LL n,m;
LL C(int n,int m)
{
if(n<m) return 0;
return js[n]*ny[m]%mo*ny[n-m]%mo;
}
int a[MAXM+1],b[MAXM+1];
int main()
{
cin>>n>>m;
M=1,L=0;
while(M<2*n+2) M<<=1,L++;
init();
LL v=1;
fo(i,0,n)
{
a[i]=v*C(n,i)%mo*js[2*(n-i)]%mo%mo;
b[i]=ny[i]%mo;
v=mo-v;
v=v*2%mo;
}
DFT(a),DFT(b);
fo(i,0,M-1) a[i]=(LL)a[i]*b[i]%mo;
IDFT(a);
LL ans=0,vs=1,ck=1,cn=1;
fo(i,0,min(m-1,n*2-1)) cn=(m-i)%mo*js[i]%mo*ny[i+1]%mo*cn%mo;
fo(i,0,n)
{
if(2*(n-i)<=m-i) ans=(ans+vs*ck%mo*cn%mo*a[i]%mo*js[i]%mo)%mo;
vs=vs*ny[2]%mo;
ck=(m-i)%mo*js[i]%mo*ny[i+1]%mo*ck%mo;
if(2*(n-i)<=m-i) cn=cn*ksm((m-i)%mo*((m-2*n+i+1)%mo)%mo,mo-2)%mo*(((n-i)*2-1+mo)%mo*((n-i)*2%mo)%mo)%mo;
}
ans=ans*vs%mo*2%mo;
printf("%lld\n",ans);
}
【杂题】[LibreOJ #6608] 无意识的石子堆【容斥原理】【FFT】的更多相关文章
- LOJ6609 无意识的石子堆【加强版】【容斥原理,计数】
题目描述:在一个\(n\times m\)的网格中,放\(2n\)个棋子,使每一行和每一列都不超过两个棋子.求方案数\(\mathrm{mod} \ 943718401\). 数据范围:\(n\le ...
- 【Java面试】-- 杂题
杂题 2019-11-03 21:09:37 by冲冲 1.类加载器的双亲委派机制 类加载器:把类通过类加载器加载到JVM中,然后转换成class对象(通过类的全路径来找到这个类). 双亲委派机制 ...
- 贪心/构造/DP 杂题选做Ⅱ
由于换了台电脑,而我的贪心 & 构造能力依然很拉跨,所以决定再开一个坑( 前传: 贪心/构造/DP 杂题选做 u1s1 我预感还有Ⅲ(欸,这不是我在多项式Ⅱ中说过的原话吗) 24. P5912 ...
- 贪心/构造/DP 杂题选做Ⅲ
颓!颓!颓!(bushi 前传: 贪心/构造/DP 杂题选做 贪心/构造/DP 杂题选做Ⅱ 51. CF758E Broken Tree 讲个笑话,这道题是 11.3 模拟赛的 T2,模拟赛里那道题的 ...
- 由Java中toString()方法引发的无意识的递归想到的
先看一段很简单的java代码: toString()/** * @author jeffwong */ public class InfiniteRecursion { public String t ...
- 无意识(无知)-->有意识-->进入潜意识-->无意识(本能状态)
无意识(无知)-->有意识-->进入潜意识-->无意识(本能状态) 1. 从“无意识-->有意识”的两个重要内容是“反省”+“要努力学习”,估计有80%的人无法跨过这一步 2. ...
- 正睿OI DAY3 杂题选讲
正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...
- dp杂题(根据个人进度选更)
----19.7.30 今天又开了一个新专题,dp杂题,我依旧按照之前一样,这一个专题更在一起,根据个人进度选更题目; dp就是动态规划,本人认为,动态规划的核心就是dp状态的设立以及dp转移方程的推 ...
- wangkoala杂题总集(根据个人进度选更)
CQOI2014 数三角形 首先一看题,先容斥一波,求出网格内选三个点所有的情况,也就是C(n*m,3);然后抛出行里三点共线的方案数:C(n,3)*m; 同理就有列中三点共线的方案数:n*C(m,3 ...
随机推荐
- 【转帖】网卡多队列技术与RSS功能介绍
网卡多队列技术与RSS功能介绍 2017年02月08日 15:44:37 Murphy_0806 阅读数 10665 标签: rss网卡dpdk 更多 个人分类: DPDK https://blog. ...
- P4942小凯的数字
给定一个序列,如12345 56789 1011121314等,输出对其取余9的结果. 那么我们需要明白一个定理,一个序列对一个数的取余结果等于它各位之和取余那个数的结果.证明似乎是这样∑i=0na ...
- 剑指offer-正则表达式匹配-字符串-python****
# -*- coding:utf-8 -*- ''' 题目:请实现一个函数用来匹配包括'.'和'*'的正则表达式. 模式中的字符'.'表示任意一个字符(不包括空字符!),而'*'表示它前面的字符可以出 ...
- java 矩阵的运算
首先需要引入包Jama-1.0.2.jar 这个包下封装的对矩阵运算的方法,包括矩阵的加减乘除逆运算等 包下载地址:https://math.nist.gov/javanumerics/jama/ ...
- springcloud(十一)-Zuul聚合微服务
前言 我们接着上一节.在许多场景下,外部请求需要查询Zuul后端的多个微服务.比如一个电影售票手机APP,在购票订单页上,既需要查询“电影微服务”获得电影相关信息,又需要查询“用户微服务”获得当前用户 ...
- 2018年4月份,阿里最新的java程序员面试题目,仅供参考。
目录 技术一面(23问) 技术二面(3大块) 性能优化(21点) 项目实战(34块) JAVA方向技术考察点(15点) JAVA开发技术面试中可能问到的问题(17问) 阿里技术面试1 1.Java I ...
- 在不同电脑设备之间, 同步 VSCode 的插件和配置
前提有一个码云或者github的账户,以下是我用github的示例(只有第二步不一样): Step1. 安装 同步插件"Settings Sync" Step2. 进入github ...
- 禁止ios10双指缩放
document.addEventListener('gesturestart', function(event) { event.preventDefault(); });
- adb进阶知识,如何过滤只查看某一个app的日志
前面大概学习了adb基础,但是adb的存在,在测试人员中究竟有什么必要,以及看log时,那么多的log,让我们看个屁啊,所以这一次,我决定一定要把adb这件事情搞清楚. 1.先来看最感兴趣的adb ...
- Python基础编程:字符编码、数据类型、列表
目录: python简介 字符编码介绍 数据类型 一.Python简介 Python的创始人为Guido van Rossum.1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心 ...