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组可以为空,然后可以用乘法原理合起来 容斥容斥 \[ 每个同学至少 ...
随机推荐
- 使用MyEclipse开发Java EE应用:企业级应用程序项目(下)
你开学,我放价!MyEclipse线上狂欢继续!火热开启中>> [MyEclipse最新版下载] 二.项目组织.依赖性和类解析 JEE规范为企业应用程序定义了一个分层的Java类解决策略, ...
- [转]数据库更新(Update语句)查询
2011-03-27 10:40:11| 分类: Database |举报|字号 订阅原文出自:http://blog.csdn.net/ylnjust02/archive/2005/12/10/54 ...
- 想ACCESS数据库插入新的用户
public string AddUserN = ""; //定义用户名字符串 public string paswrd1 = ""; //密码1 public ...
- MAC中安卓开发环境的下载
今天终于为我的Macbook Pro Retina搭建好了Android开发环境,几经折磨,差点放弃了: 总结如下:1.最好选择ADT Bundle,这里面已经集成好了Eclipse.ADT.Andr ...
- magento建立多语言网站
默认Magento仅仅有English语言包,所以如果想也显示中文,就要安装中文语言包. 步骤: 1. 首先,去http://www.magentocommerce.com/langs/list/下载 ...
- HDU1081 最大字段和 压缩数组(单调队列优化)
最大字段和题型,推荐做题顺序: HDU1003 HDU1024 HDU1081 ZOJ2975 ZOJ2067 #include<cstdio> #include<cstdlib& ...
- # 20155327 2016-2017-4 《Java程序设计》第七周学习总结
20155327 2016-2017-4 <Java程序设计>第七周学习总结 教材学习内容总结 了解Lambda语法 包含三个部分 一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法 ...
- Codeforces 698A:Vacations(DP)
题目链接:http://codeforces.com/problemset/problem/698/A 题意 Vasya在n天中,有三件事情可以做,健身.比赛或者休息,但是不能连续两天都是比赛或都是但 ...
- 51Nod 1091:线段的重叠(贪心)
1091 线段的重叠 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 X轴上有N条线段,每条线段包括1个起点和终点.线段的重叠是这样来算的,[10 ...
- Roslyn编译器-C#动态脚本实现方案
[前言] Roslyn 是微软公司开源的 .NET 编译器. 编译器支持 C# 和 Visual Basic 代码编译,并提供丰富的代码分析 API. Roslyn不仅仅可以直接编译输出,难能可贵的就 ...