数学上来先打表 SRM 10

描述

给出 n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案:
1.每条边连接两个不同的点,每两个点之间至多有一条边
2.不存在三个点a,b,c使三个点间两两可以互相到达且两两之间最短距离相等
3.边的长度均为1

输入格式

一行,一个整数n

输出格式

一行,一个整数,表示方案数对1004535809取模的结果。

样例输入

3

样例输出

7

数据范围与约定

对于8组数据,1<=n<=9
对于余下8组数据,10<=n<=2000

样例解释

三个点之间没有边,有1种方案
三个点之间有一条边,有3种方案
三个点之间有两条边,有3种方案

—————————————————————

这道题观察可得这n个数组成的不是环就是链

是环还必须大于3且不能是3的倍数

我们任然可以先预处理出各个阶乘的逆元

T是2关于mod的逆元 这个根据费马小定理可以算出来

f【i】表示大小为i的联通块的个数

如果是链 方案数是 i!/2 这个时候T作为2的逆元就显示出作用辣

至于为什么是i!/2 因为各个点不同我们可以看作是排列而一个排列对应一个方案,一个方案被算两次

如果是环 就是(i-1 )!/2 因为是环我们可以钦定一个数作为起点 剩下i-1个数来排列

当然只有1不符合上述推断 所以要单独考虑

这样处理完之后我们就可以来算答案ans辣

ans【k】=sigma(1-k) f【i】*g【k-i】*C(i-1,j-1);

也就是我们选i个数作为联通快其余随意的总和

至于为什么是C(i-1,j-1)

因为如果固定一个点统计,g就可以每个图只算一次

这样才能保证每个合法方案中只有一个连通块被算到,且只算了一次

#include<cstdio>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
const int M=,mod=;
LL read(){
LL ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int n;
LL T,w[M],b[M],f[M],ans[M];
LL qmod(LL a,LL b,LL c){
LL ans=;
while(b){
if(b&) ans=ans*a%c;
b=b/;
a=a*a%c;
}
return ans;
}
void prepare(){
int mx=; w[]=;
for(int i=;i<=mx;i++) w[i]=w[i-]*i%mod;
b[mx]=qmod(w[mx],mod-,mod);
for(int i=mx;i>=;i--) b[i-]=b[i]*i%mod;
T=qmod(,mod-,mod);
}
LL C(int n,int m){return w[n]*b[m]%mod*b[n-m]%mod;}
int main()
{
n=read();
prepare();
f[]=;
for(int i=;i<=n;i++){
f[i]=w[i]*T%mod;
if(i>&&i%) f[i]=(f[i]+w[i-]*T)%mod;
}
ans[]=;
for(int i=;i<=n;i++){
for(int j=;j<=i;j++){
ans[i]=(ans[i]+f[j]*ans[i-j]%mod*C(i-,j-)%mod)%mod;
}
}
printf("%lld\n",ans[n]);
return ;
}

汕头市队赛 SRM10 T3 数学上来先打表的更多相关文章

  1. 汕头市队赛SRM14 T3覆盖

    我们可以考虑两种情况 区间之间不相重叠 和 重叠 f[i][j]表示以当前最后一个区间以 i 结尾 并且选了 j 个区间 不相重叠的话 只要选 1-i-w 的max再加上 包含i在内的前四个数的和 相 ...

  2. 汕头市队赛 SRM13 T3

    这道题可以贪心 维护一个答案队列 枚举位置 每次将比当前位置大的队尾全部替代掉 记录删了多少了就好了 #include<cstdio> #include<iostream> # ...

  3. 汕头市队赛 SRM10 T1 贪心只能过样例

    贪心只能过样例 SRM 10 描述 给出n个数a[i](1<=a[i]<=n),问最多能把这些数分成几组,使得每个数a[i]所在的组至少有a[i]个数 输入格式 第一行一个整数n,接下来n ...

  4. 汕头市队赛 SRM10 T1模拟只会猜题意

    模拟只会猜题意 SRM 10 描述 有一本n个单词的词典,求按下列方法能造出的不相同的词汇数目.  1.词典中的单词是一个词. 2.能分为两部分的,其中前一部分是一个词典词或者其非空前缀,后一部分是一 ...

  5. 汕头市队赛 SRM10 dp只会看规律 && bzoj1766

    dp只会看规律 SRM 10 描述 平面上有n个点(xi,yi),用最少个数的底边在x轴上且面积为S的矩形覆盖这些点(在边界上也算覆盖) 输入格式 第一行两个整数n,S接下来n行每行两个整数xi,yi ...

  6. 汕头市队赛 C KMP codeforces B. Image Preview

    汕头市队赛题目传送门 codeforces题目传送门 这道题我的做法是 尝试先往左走然后往右走 或者先往右走然后往左走 然后注意一下枚举顺序就okay啦 #include<cstdio> ...

  7. 汕头市队赛 C SRM 05 - YYL 杯 R1 T3!

    C SRM 05 - YYL 杯 R1 背景 tjmak 描述 给一个大小为n的序列V.序列里的元素有正有负.问至少要删除多少个元素使得序列里不存在区间(要求非空)和 >= S.如果答案大于m, ...

  8. 汕头市队赛SRM 20 T3 灵魂觉醒

    背景 自从芽衣.布洛妮娅相继灵魂觉醒之后,琪亚娜坐不住了.自己可是第一个入驻休伯利安号的啊!于是她打算去找德丽莎帮忙,为她安排了灵魂觉醒的相关课程. 第一天,第一节课. “实现灵魂觉醒之前,你需要先将 ...

  9. 汕头市队赛SRM15

    T1——czl SRM 15 众所周知,czl家养了一只可♂爱的***(已屏蔽),那只东西很贪吃,所以czl家很多零食仓库,然而这些仓库里有很多老鼠. 为了心爱的***,czl决定点燃纯艾条,用烟熏老 ...

随机推荐

  1. Head First Java-图形化界面

    Head First Java是本挺好的书,讲的比较清楚和简单.主要看原则.概念啥的.语法什么的,还是靠谷歌吧:) 这部分的笔记也有很多了,最近会努力更新和搬运.顺便自己也重新读一下. 就酱.想要这本 ...

  2. Numpy数据存取与函数

    数据的CSV文件存取 多维数据的存取 NumPy的随机数函数 NumPy的统计函数 NumPy的梯度函数

  3. python基础之模块part2

    sys: sys模块不同于os模块,这个是跟Python解释器打交道的. sys.argv:返回一个文件名开头,包含后面输入内容的 列表 import sys res = sys.argv print ...

  4. 奇异值分解(SVD)原理详解及推导

    在网上看到有很多文章介绍SVD的,讲的也都不错,但是感觉还是有需要补充的,特别是关于矩阵和映射之间的对应关系.前段时间看了国外的一篇文章,叫A Singularly Valuable Decompos ...

  5. 微信小程序 | 51,live新课“小程序UI容器组件”的课堂计划

    零基础前端自学入门:小程序UI容器组件 这是一节以UI布局.容器组件的使用为主题的live,专注于布局与容器这一个点,努力把这一点讲透.这是继4月22日整体入门live“零基础周末学习小程序开发”之后 ...

  6. adnroid 打包问题 :compileReleaseJavaWithJavac

    今天打包的时候,由于着急.改了些本地的变化就assembleRelease. 然后就报错: compileReleaseJavaWithJavac 后来网上乱找,.... 之后我想到先跑一下,果然是因 ...

  7. (A)eclipse搭建springboot项目入门

    网上许多资料都是用idea的,但是我个人用eclipse习惯了,所以就在eclipse里面自己尝试着写了一个hello. 然而项目建好后却迟迟不能访问!!!网上搜了许多资料都不靠谱! 虽然最后能看到h ...

  8. Windows下zookeeper注册中心的安装和启动

    zookeeper的安装支持单机模式和集群模式 下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/,当前稳定版本为3.4.8 单机模式 修改zoo ...

  9. C语言库函数实现 【微软面试100题 第八十三题】

    题目要求 1.strcpy/memcpy/memmove: 2.memset函数: 3.字符串处理函数. 题目分析 1.接口定义: char * strcpy(char * dest, const c ...

  10. 《算法》C++代码 Dijkstra

    单源最短路,复杂度是O(N²),堆优化的是O(NlogN).基本思想是贪心,每次都加入一个当前最近的点,可以证明每次当时最近的点就是当前最短的路径.因此,所有点都加入之后,起点到所有点的最短路径就都求 ...