【清华集训2017模拟】Catalan
Description
求Cnmod3814697265625(518)C_n \mod 3814697265625(5^{18})其中CnC_n为卡特兰数第n项
n<=10^18,T<=10
Solution
这么大的组合数取模啊。。。。以前真没见过
首先我们知道Ans=Cn2nn+1Ans={C_{2n}^{n}\over n+1}
根据套路我们只需要把n!写成5^e*f的形式,然后就可以用逆元直接算了
但是如何计算?
首先我们把所有5的倍数提取出来,那么有⌊n5⌋\lfloor{n\over 5}\rfloor个5,并且剩下的数变成了⌊n5⌋!\lfloor{n\over 5}\rfloor!
这样就可以递归下去计算了
那么如何处理剩余的部分?
我们在处理乘法的时候忽略5的倍数,设L=m−−√o=59L=\sqrt mo=5^9,那么我们相当于要求
\prod_{i=0}^{\lfloor{n\over L}\rfloor-1}\prod_{j=0}^{L-1}(iL+j)
假如我们把i,l当做常数,那么我们可以发现后面的东西可以写成(a*i*L+b)的形式
a和b只和L有关,可以预处理
那么这样我们处理出a,b,再处理出一个前缀积,这个东西就可以O(1)计算了
预处理的复杂度是O(L)的
多出来的那一部分直接处理就好了
但是这样只能处理n<=mo的情况,n>mo的情况处理不了,怎么办呢?
我们发现n>mo的时候我们可以把1~n的数按mo分类,其中每一组在模意义下都是同余的
这样直接快速幂计算即可
总复杂度O(L+T log^2N)
Code
#include <cstdio>
#include <cstring>
#include <algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
typedef double db;
const ll mo=3814697265625;
const int L=1953125;
struct note{int e;ll f;note(int _e=0,ll _f=0) {e=_e;f=_f;}
};
ll f[L][2],sum[L],n;
ll mult(ll a,ll b) {ll a1=a/L,b1=a%L,a2=b/L,b2=b%L;ll tmp=a1*a2%mo*L%mo*L%mo;(tmp+=a1*L%mo*b2%mo)%=mo;(tmp+=a2*L%mo*b1%mo)%=mo;(tmp+=b1*b2%mo)%=mo;return tmp;
}
ll mi(ll x,ll y) {ll z=1;for(;y;y/=2,x=mult(x,x))if (y&1) z=mult(z,x);return z;
}
ll F(ll n) {ll a=n/L,b=n%L,ans=1;if (a) ans=mult(ans,sum[a-1]);ans=mult(ans,(mult(mult(f[b][1],a),L)+f[b][0])%mo);return ans;
}
note solve(ll n) {if (!n) return note(0,1);note x=solve(n/(ll)5),ans;if (n>mo) {ll a=n/mo,b=n%mo;ans.f=mult(x.f,mult(mi(F(mo),a),F(b)));} else ans.f=mult(x.f,F(n));ans.e=(ll)(x.e+n/(ll)5)%18;return ans;
}
void exgcd(ll a,ll b,ll &x,ll &y) {if (!b) {x=1;y=0;return;}ll xx,yy;exgcd(b,a%b,xx,yy);x=yy;y=xx-a/b*yy;
}
ll get_inv(ll x) {ll a,b;exgcd(x,mo,a,b);return ((a%=mo)+=mo)%=mo;
}
int main() {freopen("catalan.in","r",stdin);freopen("catalan.out","w",stdout);f[0][0]=1;fo(i,1,L-1) {if (!(i%5)) {f[i][0]=f[i-1][0];f[i][1]=f[i-1][1];continue;}f[i][0]=mult(f[i-1][0],(ll)i);f[i][1]=(f[i-1][0]+mult(f[i-1][1],(ll)i))%mo;}sum[0]=f[L-1][0];fo(i,1,L-1) sum[i]=mult(sum[i-1],(mult(mult(f[L-1][1],(ll)i),(ll)L)+f[L-1][0])%mo);int ty;for(scanf("%d",&ty);ty;ty--) {scanf("%lld",&n);note a=solve(2*n);note b=solve(n);(a.e+=18-2*b.e%18)%=18;ll ni=get_inv(b.f);a.f=mult(a.f,mult(ni,ni));ll nn=n+1;for(;!(nn%5);nn/=5) (a.e+=17)%=18;a.f=mult(a.f,get_inv(nn));ll c=mult(a.f,mi(5,a.e));printf("%lld\n",c);}
}
【清华集训2017模拟】Catalan相关推荐
- JZOJ 5490. 【清华集训2017模拟11.28】图染色
Description Input 第一行包括两个整数N,M. 接下来M行每行两个整数u,v,代表存在一条里连接 u,v的无向边.可能存在重边自环. Output 降序输出所有不为0的F(i) .保留 ...
- JZOJ 5489. 【清华集训2017模拟11.28】海明距离
Description 设有一长度为n的初始每个位置均为0的序列A.再给定一个长度为n的01序列B. 有Q个特殊的区间[li,ri],你可以选择将A中li到ri这些位置都变为1,当然你可以选择不变. ...
- JZOJ 5484. 【清华集训2017模拟11.26】快乐树
Description 一棵树有n个节点,编号为0到n-1.有一条叫Owaski的狗在树上面走,每一次它可以从一个顶点走到它的任何一个相邻顶点.每个顶点有个可正可负的快乐度,Owaski也有一个快乐度 ...
- JZOJ 5483. 【清华集训2017模拟11.26】简单路径
Description 给定一棵带边权的树,选择两条没有公共边的简单路径(长度可以为0),使得所有在任意一条路径上的边的异或和尽量大. Input 第一行一个数n表示点数,点的编号是0到n-1. 接下 ...
- jzoj5498 【清华集训2017模拟12.10】大佬的难题 巧妙容斥
分治容斥都想了,但想不出正解.. 先说60分的吧 先排序a,然后在b,c上分治. 我们将b两边归并的同时,用数据结构维护b比当前小的c都在哪些地方. 这样就是n log2 n 再说说正解 记a[x] ...
- JZOJ5498. 【清华集训2017模拟12.10】大佬的难题
Sample Input Sample Input1: 4 201334450 1474105774 350932494 Sample Input2: 97670 1734691087 7596883 ...
- [JZOJ5498]【清华集训2017模拟12.10】大佬的难题
Description 给出三个1~n的排列a,b,c 求 ∑1≤i,j≤n[ai<aj][bi<bj][ci<cj] \sum\limits_{1\leq i,j\leq n}[a ...
- Loj #2324. 「清华集训 2017」小 Y 和二叉树
Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...
- [LOJ#2329]「清华集训 2017」我的生命已如风中残烛
[LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...
最新文章
- OpenCV中常用到的轮廓处理函数汇总
- 两张照片重叠处半透明_手机可以“抛起来”拍照,给你的照片换个角度
- java终结方法_Java终结任务:Callable和Future
- Mysql启动自己主动设置max_connections为其它值
- opencv 图像颜色空间转换和特定颜色物体追踪
- javascript学习之利用方向键控制div模块的移动
- Tomcat从socket到java Servlet
- Java Windows,Linux视频抽帧的4种方式
- 小新700linux网卡驱动,联想小新air无线网卡驱动-联想小新air笔记本无线网卡驱动下载v2.1 官方最新版-西西软件下载...
- 朴素贝叶斯——R语言
- debian mysql 日志_Apache2:使用mod_log_sql(Debian Etch)记录到MySQL数据库
- Java面试复习提纲
- 破壳而出的琉璃之鸟汉化 QA
- html 图片自动滚动播放,小卖弄:纯CSS实现图片滚动播放效果
- ASPICE_SWE.1_01_02_SQ3RNote
- matlab局部放大曲线功能
- Altium Designer一些好用的系统设置
- BuKu web18 秋名山车神
- 河南地图网 vs Google maps —— 河南地图网横向评测
- 镭神激光雷达16线驱动安装及使用(最新驱动修复时间戳、libpcap)
热门文章
- scipy.signal.peak_prominences解析
- Android Studio 在MuMu模拟器上实现 xposed简单劫持
- 【Maya】编译USD(个人笔记)
- 计算机分栏过程,计算机基础与程序设计-要点分栏.docx
- 信号与系统、数字信号处理、滤波、傅里叶变换、数字信号模拟信号采样信号、滤波器零阶保持器
- 安装配置flume(超详细)
- 创客学院线上培训课程泄露,大家抓紧白嫖!
- 计算机保研夏令营预推免面试经验(吉林大学+哈工大威海+北京理工医工融合
- 在网上购物竟然也能和Python扯上关系!电脑上用自己写的程序购物?别说,QT实现还真挺简单(Python如何利用QT制作电脑的手机版拼多多)
- SwiftUI开发-@EnvironmentObject、ObservableObject、@Published理解