【算法】DP+数学计数

【题意】给出n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案(对1004535809取模):

1.每条边连接两个不同的点,每两个点之间至多有一条边。

2.不存在三个点a,b,c使三个点间两两可以互相到达且两两之间最短距离相等。

3.边的长度均为1。

n<=2000

【题解】

p[i]表示i个点形成联通块的满足条件的方案数。

如果i个点形成链,则一定是直链,如果有分支则一定不满足条件,如此有n!/2种方案(排列,正反算一种)

如果i个点形成环,则一定是i-1条边形成的大环,否则一旦有分支则一定不满足条件,如此有(n-1)!种方案(排列,多算了n次)

如果i%3=0,则大环也不满足条件,所以有0种方案。

p[n]=n!/2+(n-1)! n%3!=0

p[n]=n!/2            n%3==0

(注意p[1]=1要预处理。)

f[i]表示i个点的答案,试图枚举第i个点和谁形成了联通块。

f[i]=Σ(p[j]*f[i-j]*C(i-1,j-1)),1<=j<=i

(注意阶乘的逆元提前处理,否则常数太大)

小技巧:inv(2,p)=2^(p-2)%p=(p+1)/2

这种做法是套路:无向连通图计数!

#include<cstdio>
#include<algorithm>
#include<cstring>
#define ll long long
using namespace std;
const int maxn=,MOD=;
ll inv2=(MOD+)/;
ll n,fac[maxn],f[maxn],p[maxn],fav[maxn];
void exgcd(ll a,ll b,ll &x,ll &y)
{if(!b){x=;y=;return;}else{exgcd(b,a%b,y,x);y-=x*(a/b);}}
ll inv(ll a,ll n){
ll x,y;
exgcd(a,n,x,y);
return (x%MOD+MOD)%MOD;
}
ll C(ll n,ll m){return fac[n]*fav[m]%MOD*fav[n-m]%MOD;}
int main()
{
scanf("%lld",&n);
f[]=p[]=fac[]=fav[]=;
for(int i=;i<=n;i++)fac[i]=fac[i-]*i%MOD;
for(int i=;i<=n;i++)fav[i]=inv(fac[i],MOD);
p[]=f[]=;
for(int i=;i<=n;i++){
p[i]=fac[i]*inv2%MOD;
if(i>&&i%)p[i]=(p[i]+fac[i-]*inv2)%MOD;
for(int j=;j<=i;j++)f[i]=(f[i]+p[j]*f[i-j]%MOD*C(i-,j-))%MOD;
}
printf("%lld",f[n]);
return ;
}

【STSRM10】数学上来先打表的更多相关文章

  1. 汕头市队赛 SRM10 T3 数学上来先打表

    数学上来先打表 SRM 10 描述 给出 n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案:1.每条边连接两个不同的点,每两个点之间至多有一条边2.不存在三个点a,b,c使三个点间两两 ...

  2. LibreOJ β Round #2 F. 数学上来先打表

    传送门 题解 做法与题解基本无异,不过他说用vector我觉得用链表来得更好一些. #include<queue> #include<ctime> #include<bi ...

  3. F. 数学上来先打表

    题解: 搞这题搞了一天 思维不是很难 就是暴力压位bitset 分块做法速度更快 但是stl里的不能实现这个功能 所以手动实现 64位压一位 到65535跑一下1的个数 然后(x>>16) ...

  4. [loj519]数学上来先打表

    建立操作树,即1和3操作时i-1向i连边,2操作中k向i连边,然后dfs一遍 那么当我们走到一个节点,就执行该操作(修改也是操作),退出后取消该操作即可 于是相当于要维护一个东西,支持:1.加边:2. ...

  5. [国家集训队]整数的lqp拆分 数学推导 打表找规律

    题解: 考场上靠打表找规律切的题,不过严谨的数学推导才是本题精妙所在:求:$\sum\prod_{i=1}^{m}F_{a{i}}$ 设 $f(i)$ 为 $N=i$ 时的答案,$F_{i}$ 为斐波 ...

  6. 【NOIP模拟赛】 permutation 数学(打表)

    biubiu~~~ 这道题卡读题卡得很死......首先他告诉我们读循环的时候要顺着圈读,然后又说这个圈在数列上要以最大数开始读,而且以这样的循环的首数排序,得到的序列与原序列一样那么他就是可行序列, ...

  7. Latex数学符号对应表

    1. 希腊字母 字母 实现 字母 实现 $\alpha$ \alpha $\Alpha$ \Alpha $\beta$ \beta $\Beta$ \Beta $\gamma$ \gamma $\Ga ...

  8. Codeforces Round #304 (Div. 2) D 思维/数学/质因子/打表/前缀和/记忆化

    D. Soldier and Number Game time limit per test 3 seconds memory limit per test 256 megabytes input s ...

  9. [日常] NOIP前集训日记

    写点流水账放松身心... 10.8 前一天考完NHEEE的一调考试终于可以开始集训了Orz (然后上来考试就迟到5min, GG) T1维护队列瞎贪心, 过了大样例交上去一点也不稳...T出翔只拿了5 ...

随机推荐

  1. lintcode-173-链表插入排序

    173-链表插入排序 用插入排序对链表排序 样例 Given 1->3->2->0->null, return 0->1->2->3->null 标签 ...

  2. 【redis数据库学习】用JAVA连接redis数据库各种报错

    最近项目中,需要用到redis数据库,然后使用Jedis让JAVA连接redis. 首先,安装redis数据库,参考的是:http://www.runoob.com/redis/redis-insta ...

  3. 基于3D卷积神经网络的人体行为理解(论文笔记)(转)

    基于3D卷积神经网络的人体行为理解(论文笔记) zouxy09@qq.com http://blog.csdn.net/zouxy09 最近看Deep Learning的论文,看到这篇论文:3D Co ...

  4. 【Docker 命令】- images命令

    docker images : 列出本地镜像. 语法 docker images [OPTIONS] [REPOSITORY[:TAG]] OPTIONS说明: -a :列出本地所有的镜像(含中间映像 ...

  5. win7系统日志分支删除方法

    这篇日志有问题,自己亲身尝试失败,这里只提供思路,谢谢(改天突破再做修改) 之前电脑装过德国的叫啥子软件来着,当时在系统自动创建了日志,后来软件卸载了,发现还是有这个日志主键,(我有强迫症)心里不爽, ...

  6. php裁剪图片(支持定点裁剪)

    /** * 图片裁剪函数,支持指定定点裁剪和方位裁剪两种裁剪模式 * @param <string> $src_file 原图片路径 * @param <int> $new_w ...

  7. 【bzoj4580】[Usaco2016 Open]248 区间dp

    题目描述 Bessie likes downloading games to play on her cell phone, even though she does find the small t ...

  8. MySQL数据库引擎MyISAM与InnoDB的区别

    1. 存储结构 MyISAM:每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩展名为.MYD (MYData).索引文件 ...

  9. 详解 ES6 Modules

    详解 ES6 Modules 对于新人朋友来说,想要自己去搞定一个ES6开发环境并不是一件容易的事情,因为构建工具的学习本身又是一个非常大的方向,我们需要花费不少的时间才能掌握它. 好在慢慢的开始有大 ...

  10. [LOJ#2340] [WC2018] 州区划分

    题目链接 洛谷题面. LOJ题面.还是LOJ机子比较快 Solution 设\(f(s)\)表示选\(s\)这些城市的总代价,那么我们可以得到一个比较显然的\(dp\): \[ f(s)=\frac{ ...