BZOJ 1485: [HNOI2009]有趣的数列
2016-03-31 11:00
253 查看
有趣的卡特兰数列
先搞个50分的递推打个表,发现是卡特兰数列。
然后用C(2n,n)/(n+1)这个公式分解质因数计算
至于为毛是这个数列我也不造
先搞个50分的递推打个表,发现是卡特兰数列。
然后用C(2n,n)/(n+1)这个公式分解质因数计算
至于为毛是这个数列我也不造
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=100000+5; const int M=2000000+5; bool is[M]; int p[M],tot,cnt[M],mi[M],n; void sieve(){ for(int i=2;i<=2*n;i++){ if(!is[i])p[++tot]=i,mi[i]=tot; for(int j=1;j<=tot&&p[j]*i<=2*n;j++){ is[p[j]*i]=1;mi[p[j]*i]=j; if(i%p[j]==0)break; } } } void depart(int x,int v){ while(x>1){ cnt[mi[x]]+=v; x/=p[mi[x]]; } } void C(int n,int m){ for(int i=n;i>m;i--)depart(i,1); for(int i=1;i<=n-m;i++)depart(i,-1); } typedef long long ll; ll qmul(ll a,ll b,ll P){ ll ans=1; for(;b;b>>=1,a=a*a%P)if(b&1)ans=ans*a%P; return ans; } int main(){ //freopen("a.in","r",stdin); int P;scanf("%d%d",&n,&P); sieve(); C(2*n,n);depart(n+1,-1); ll ans=1; for(int i=1;i<=tot;i++) if(cnt[i])ans=ans*qmul(p[i],cnt[i],P)%P;//printf("%d %d\n",p[i],cnt[i]); printf("%lld\n",ans); return 0; }
相关文章推荐
- Json学习一(基础概念知识学习)
- 用PL/SQL导出SQL语句
- 多图片上传预览效果
- PHP pdo 链接access数据库并读取写入数据实例
- 跨域 Cookie 实现单点登录
- 跨域 Cookie 实现单点登录
- 跨域 Cookie 实现单点登录
- 跨域 Cookie 实现单点登录
- 通过思科模拟器配置多个vlan,dhcp,vtp等综合实验
- 跨域 Cookie 实现单点登录
- 相机畸变详细推导
- pso粒子群优化算法
- android 蓝牙锁应用开发实例(二)客户端基本页面
- Linux上安装resin
- Odoo Export for Admin
- rails命名约定
- Java死锁
- linux下xampp集成包安装配置方法
- java23中设计模式——结构模式——Proxy(代理) 4000
- 手机访问PC网站自动跳转到手机网站代码