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,那么我们相当于要求

∏i=0⌊nL⌋−1∏j=0L−1(iL+j)

\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相关推荐

  1. JZOJ 5490. 【清华集训2017模拟11.28】图染色

    Description Input 第一行包括两个整数N,M. 接下来M行每行两个整数u,v,代表存在一条里连接 u,v的无向边.可能存在重边自环. Output 降序输出所有不为0的F(i) .保留 ...

  2. JZOJ 5489. 【清华集训2017模拟11.28】海明距离

    Description 设有一长度为n的初始每个位置均为0的序列A.再给定一个长度为n的01序列B. 有Q个特殊的区间[li,ri],你可以选择将A中li到ri这些位置都变为1,当然你可以选择不变. ...

  3. JZOJ 5484. 【清华集训2017模拟11.26】快乐树

    Description 一棵树有n个节点,编号为0到n-1.有一条叫Owaski的狗在树上面走,每一次它可以从一个顶点走到它的任何一个相邻顶点.每个顶点有个可正可负的快乐度,Owaski也有一个快乐度 ...

  4. JZOJ 5483. 【清华集训2017模拟11.26】简单路径

    Description 给定一棵带边权的树,选择两条没有公共边的简单路径(长度可以为0),使得所有在任意一条路径上的边的异或和尽量大. Input 第一行一个数n表示点数,点的编号是0到n-1. 接下 ...

  5. jzoj5498 【清华集训2017模拟12.10】大佬的难题 巧妙容斥

    分治容斥都想了,但想不出正解.. 先说60分的吧 先排序a,然后在b,c上分治. 我们将b两边归并的同时,用数据结构维护b比当前小的c都在哪些地方. 这样就是n log2 n 再说说正解 记a[x] ...

  6. JZOJ5498. 【清华集训2017模拟12.10】大佬的难题

    Sample Input Sample Input1: 4 201334450 1474105774 350932494 Sample Input2: 97670 1734691087 7596883 ...

  7. [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 ...

  8. Loj #2324. 「清华集训 2017」小 Y 和二叉树

    Loj #2324. 「清华集训 2017」小 Y 和二叉树 小Y是一个心灵手巧的OIer,她有许多二叉树模型. 小Y的二叉树模型中,每个结点都具有一个编号,小Y把她最喜欢的一个二叉树模型挂在了墙上, ...

  9. [LOJ#2329]「清华集训 2017」我的生命已如风中残烛

    [LOJ#2329]「清华集训 2017」我的生命已如风中残烛 试题描述 九条可怜是一个贪玩的女孩子. 这天她在一堵墙钉了 \(n\) 个钉子,第 \(i\) 个钉子的坐标是 \((x_i,y_i)\ ...

最新文章

  1. OpenCV中常用到的轮廓处理函数汇总
  2. 两张照片重叠处半透明_手机可以“抛起来”拍照,给你的照片换个角度
  3. java终结方法_Java终结任务:Callable和Future
  4. Mysql启动自己主动设置max_connections为其它值
  5. opencv 图像颜色空间转换和特定颜色物体追踪
  6. javascript学习之利用方向键控制div模块的移动
  7. Tomcat从socket到java Servlet
  8. Java Windows,Linux视频抽帧的4种方式
  9. 小新700linux网卡驱动,联想小新air无线网卡驱动-联想小新air笔记本无线网卡驱动下载v2.1 官方最新版-西西软件下载...
  10. 朴素贝叶斯——R语言
  11. debian mysql 日志_Apache2:使用mod_log_sql(Debian Etch)记录到MySQL数据库
  12. Java面试复习提纲
  13. 破壳而出的琉璃之鸟汉化 QA
  14. html 图片自动滚动播放,小卖弄:纯CSS实现图片滚动播放效果
  15. ASPICE_SWE.1_01_02_SQ3RNote
  16. matlab局部放大曲线功能
  17. Altium Designer一些好用的系统设置
  18. BuKu web18 秋名山车神
  19. 河南地图网 vs Google maps —— 河南地图网横向评测
  20. 镭神激光雷达16线驱动安装及使用(最新驱动修复时间戳、libpcap)

热门文章

  1. scipy.signal.peak_prominences解析
  2. Android Studio 在MuMu模拟器上实现 xposed简单劫持
  3. 【Maya】编译USD(个人笔记)
  4. 计算机分栏过程,计算机基础与程序设计-要点分栏.docx
  5. 信号与系统、数字信号处理、滤波、傅里叶变换、数字信号模拟信号采样信号、滤波器零阶保持器
  6. 安装配置flume(超详细)
  7. 创客学院线上培训课程泄露,大家抓紧白嫖!
  8. 计算机保研夏令营预推免面试经验(吉林大学+哈工大威海+北京理工医工融合
  9. 在网上购物竟然也能和Python扯上关系!电脑上用自己写的程序购物?别说,QT实现还真挺简单(Python如何利用QT制作电脑的手机版拼多多)
  10. SwiftUI开发-@EnvironmentObject、ObservableObject、@Published理解