bzoj 2601: [Jsoi2011]同分异构体计数
Description
Input
输入文件只有一行,用空格隔开的三个整数n, m, p 。保证有m <=n,p为素数。
Output
#include<cstdio>
typedef unsigned long long u64;
typedef unsigned int u32;
int n,m;
u32 P;
int gcd(int a,int b){
for(int c;b;c=a,a=b,b=c%b);
return a;
}
int phi(int n){
int v=n;
for(int i=;i*i<=n;++i)if(n%i==){
do n/=i;while(n%i==);
v=v/i*(i-);
}
if(n>)v=v/n*(n-);
return v;
}
inline u32 fix(int a){
return a+(a>>&P);
}
struct num{
u32 x;
num(u32 a=):x(a){}
num operator+(num w){return fix(x+w.x-P);}
num operator*(num w){return u64(x)*w.x%P;}
void operator+=(num w){x=fix(x+w.x-P);}
};
num s[][],gs[],iv[],f0[][],f1[][],ans;
void cal(int m,int n){
int g=gcd(n,m);
num v=;
for(int d=;d<=g;++d)if(g%d==)v+=f0[m/d][n/d]*phi(d);
v+=f1[m][n]*m;
ans+=v*iv[m*];
}
int main(){
scanf("%d%d%u",&n,&m,&P);
if(m>n)m=n;
s[][]=iv[]=;
for(int i=;i<=;++i)iv[i]=iv[P%i]*(P-P/i);
for(int i=;i<=n;++i){
f0[][i]=f1[][i]=s[][i-]+s[][i-]+s[][i-];
gs[]=f0[][i]+s[][i-];
for(int j=;j<=;++j)gs[j]=gs[j-]*(gs[]+(j-))*iv[j];
for(int j=;j;--j){
for(int k=n;k>=i;--k){
for(int t=;t<=j;++t){
int w=k-t*i;
if(w>=)s[j][k]+=gs[t]*s[j-t][w];
}
}
}
}
for(int i=;i<=m;++i){
for(int j=i;j<=n;++j){
for(int k=;k<j;++k)f0[i][j]+=f0[i-][j-k]*f0[][k];
if(i&){
for(int k=;k<j;k+=)f1[i][j]+=f0[i>>][k>>]*f0[][j-k];
}else{
for(int k=;k<j;++k)f1[i][j]+=f1[i-][j-k]*f0[][k];
if(~j&)f1[i][j]+=f0[i>>][j>>];
f1[i][j]=f1[i][j]*iv[];
}
}
}
for(int i=;i<=m;++i)cal(i,n);
printf("%d\n",ans.x);
return ;
}
bzoj 2601: [Jsoi2011]同分异构体计数的更多相关文章
- BZOJ 4517: [Sdoi2016]排列计数
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 911 Solved: 566[Submit][Status ...
- [BZOJ]1016 JSOI2008 最小生成树计数
最小生成树计数 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同 ...
- bzoj 2209: [Jsoi2011]括号序列 splay
2209: [Jsoi2011]括号序列 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 833 Solved: 392[Submit][Status ...
- [BZOJ 1016] [JSOI2008] 最小生成树计数 【DFS】
题目链接:BZOJ - 1016 题目分析 最小生成树的两个性质: 同一个图的最小生成树,满足: 1)同一种权值的边的个数相等 2)用Kruscal按照从小到大,处理完某一种权值的所有边后,图的连通性 ...
- 数学(错排):BZOJ 4517: [Sdoi2016]排列计数
4517: [Sdoi2016]排列计数 Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 693 Solved: 434[Submit][Status ...
- BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )
不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...
- BZOJ 2209: [Jsoi2011]括号序列 [splay 括号]
2209: [Jsoi2011]括号序列 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1111 Solved: 541[Submit][Statu ...
- BZOJ 4517: [Sdoi2016]排列计数 [容斥原理]
4517: [Sdoi2016]排列计数 题意:多组询问,n的全排列中恰好m个不是错排的有多少个 容斥原理强行推♂倒她 $恰好m个不是错排 $ \[ =\ \ge m个不是错排 - \ge m+1个不 ...
- BZOJ 4710: [Jsoi2011]分特产 [容斥原理]
4710: [Jsoi2011]分特产 题意:m种物品分给n个同学,每个同学至少有一个物品,求方案数 对于每种物品是独立的,就是分成n组可以为空,然后可以用乘法原理合起来 容斥容斥 \[ 每个同学至少 ...
随机推荐
- MinGW安装教程——著名C/C++编译器GCC的Windows版本
前言本文主要讲述如何安装 C语言 编译器——MinGW,特点是文章附有完整详细的实际安装过程截图,文字反而起说明提示作用. 编写本文的原因始于我的一个观点:图片可以比文字传达更多的信息,也能让其他人更 ...
- bzoj1464
题解: 简单bfs 显然不能到负数 也不能超过k两倍 代码: #include<bits/stdc++.h> using namespace std; ; int b[N],vis[N], ...
- struts2返回json字符串
参考链接:http://www.cnblogs.com/starsli/p/4733669.html 1.通过使用struts2-json-plugin 插件来实现 2.通过收到使用json-lib提 ...
- session进行增删改查操作
一般将针对数据库的操作放在事物里面, 开始事物:session.beginTransaction(); 获取事物:session.getTransaction(); 提交事物:transaction. ...
- tomcat用户配置,内存配置,pid配置
一:tomcat用户配置 1.打开 webapps\manager\WEB-INF\web.xml 可以看到tomcat所有的角色名,后面我们就是需要配置这些角色 2.给用户添加角色 打开 conf/ ...
- centos7 vsftp的安装
首先下载vsftp yum install -y vsftpd 安装好了之后 编辑默认的文件 vi /etc/vsftpd/vsftpd.conf 更改下面的: anonymous_enable=NO ...
- Cross-Site Script
Cross-Site Script(跨站脚本)XSS 整理于<浅析XSS(Cross Site Script)漏洞原理> 了解XSS的触发条件就先得从HTML(超文本标记语言)开始,我 ...
- Linux 系统信息查询
众所周知,Linux大部分操作是通过命令实现的,并不像windows那么直观.linux查看硬件信息也是需要通过linux查看硬件信息命令查询的,下面小编来分享一下linux查看硬件信息的方法和命令写 ...
- videojs 隐藏videobar
video::-internal-media-controls-download-button { display: none; } video::-webkit-media-controls-enc ...
- Robot Framework 自定义库
进入 python安装路径\Lib\site-packages 创建文件夹,库名 创建py文件,myclass.py 创建py文件,__init__.py 导入自定义库 遇到的问题: python版 ...