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组可以为空,然后可以用乘法原理合起来 容斥容斥 \[ 每个同学至少 ...
随机推荐
- bzoj3404
题解: 博弈论 然而我直接暴力dp 代码: #include<bits/stdc++.h> using namespace std; ; int f[N],n,T; void init() ...
- bzoj1084&&洛谷2331[SCOI2005]最大子矩阵
题解: 分类讨论 当m=1的时候,很简单的dp,这里就不再复述了 当m=2的时候,设dp[i][j][k]表示有k个子矩阵,第一列有i个,第二列有j个 然后枚举一下当前子矩阵,状态转移 代码: #in ...
- 多种方法实现 python 线程池
最近在做一个爬虫相关的项目,单线程的整站爬虫,耗时真的不是一般的巨大,运行一次也是心累,,,所以,要想实现整站爬虫,多线程是不可避免的,那么python多线程又应该怎样实现呢?这里主要要几个问题(关于 ...
- delphi中使用MSWINSCK.OCX控件
1.首先是把winsck控件导入到delphi中,就是导入一个ActiveX控件,步骤略过. 2.将导入的winsck控件拖入你的Form中. 3.对winsck进行基本设置(IP,Port). 4. ...
- Maven入门-3.pom文件和settings文件
1.pom.xml文件介绍2.settings.xml文件介绍 1.pom.xml文件介绍 Maven项目的核心是pom.xml,pom(Project Object Model项目对象模型) pom ...
- CCScrollView
#ifndef TestCCScrollView_testScene_h #define TestCCScrollView_testScene_h #include "cocos2d.h&q ...
- runtime error (运行时错误)
比如说: ①除以零 ②数组越界:int a[3]; a[10000000]=10; ③指针越界:int * p; p=(int *)malloc(5 * sizeof(int)); *(p+10000 ...
- 题目1001:A+B for Matrices
题目1001:A+B for Matrices 时间限制:1 秒内存限制:32 兆 题目描述: This time, you are supposed to find A+B where A and ...
- Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.app.ActionBar.setDisplayShowHomeEnabled(boolean)' on a null object reference
/********************************************************************************* * Caused by: java ...
- 一步步入门log4cpp
前言 项目实现过程中,需要检查.查找或者调试程序bug等,此时程序日志则较为清晰地展现代码的运行过程.目前接触到的方法有打印消息到控制台,将重要信息输出到某个文件比如txt文件,或者直接使用日志库. ...