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组可以为空,然后可以用乘法原理合起来 容斥容斥 \[ 每个同学至少 ...
随机推荐
- pyinstaller又踩一坑, configparser os.mknod
在使用pyinstaller时,有使用configparser模块. 使用相对路径.在pycharm中测试,正常,打包成exe,就出错了 换用绝对路径, print(os.getcwd()) fp_d ...
- Apache自带性能测试工具ab的使用
Apache服务器套件自带ab,只要安装Apache即可,无需另行安装ab.ab位于%ApacheHome%/bin目录下(“%ApacheHome%”为Aapche安装路径),你也可以把ab.exe ...
- (C/C++学习笔记) 十一. 数组
十一. 数组 ● 基本概念 数组:数组是一组在内存中依次连续存放的(数组所有元素在内存中的地址是连续的).具有同一类型的数据变量所组成的集合体.其中的每个变量称为数组元素,它们属于同一种数据类型,数组 ...
- NetworkManager 命令配置nmcli注意
1.使用nmcli connection modify对connection进行修改的时候,ipv4.addresses的输入格式为"ip/mask空格gateway",例如172 ...
- apache2.4搭建php5.53问题总结
1.如果Apache handler方式配置php,则最好选择Thread Safe,否则找不到php5apache2_4.dll.如果选择VC6版本以上的php,请到这里http://www.apa ...
- Ad Muncher 目前半价优惠^_^
优惠地址
- SharePoint 2013的100个新功能之内容管理(三)
一:视频中的人 作为视频内容类型的一部分,一个新的栏"视频中的人"被加入到其中,可以指定视频中的人,作为视频的元数据.当你编辑视频属性时可以查看到该栏.更多信息 二:重建索引 一个 ...
- Flume-NG源码阅读之Interceptor(原创)
有的时候希望通过Flume将读取的文件再细分存储,比如讲source的数据按照业务类型分开存储,具体一点比如类似:将source中web.wap.media等的内容分开存储:比如丢弃或修改一些数据.这 ...
- HPU 1471:又是斐波那契数列??(大数取模)
1471: 又是斐波那契数列?? 时间限制: 1 Sec 内存限制: 128 MB 提交: 278 解决: 27 统计 题目描述 大家都知道斐波那契数列吧?斐波那契数列的定义是这样的: f0 = 0; ...
- Redis安装和主要功能简介
Redis安装和主要功能简介 Redis(https://redis.io/), 是一个内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 安装Redis 我很少在开发机中直接装各种数 ...