首页 > 其他分享 >ZOJ - 4069(2018 青岛现场赛 L) - 指数型生成函数

ZOJ - 4069(2018 青岛现场赛 L) - 指数型生成函数

时间:2023-05-31 10:07:17浏览次数:54  
标签:系数 个点 ll int 多项式 ZOJ 4069 2018 inv


题目链接:https://vjudge.net/problem/ZOJ-4069

 

解题思路:

1.n个点组成环的不同种类数是(n-1)!/2;n个点组成一条链的不同种类数是n!/2,特别的n==1时种类数为1。

用指数型生成函数表示k个点形成链的种类: 1/2(2x+2!*x^2/2!+3!*x^3/3!+4!*x^4/4!+..+n!*x^n/n!) = 1/2(2*x+x^2+x^3+x^4+..+x^n) = S

x*S = 1/2(2x^2+x^3+x^4+..+x^(n+1)),x*S - S = 1/2(x^2+x^(n+1)-2*x),S = 1/2*(x^2+x^(n+1)-2*x)/(x-1) = 1/2*x*(x+x^n-2)/(x-1)。

当|x|<1时,n->∞时,x^n->0,S = 1/2*x*(x-2)/(x-1) = x*(1-x/2)/(1-x)

同理用上诉方法当|x|<1,n->∞时可以求得1+x+x^2+x^3+...+x^n = 1/(1-x)。(这个不就是上面式子的分母吗?下面会说他的作用)

2.如果在n个点中只给你m条边,那么最后形成的图肯定是由n-m条链组成的,令k = n - m。

3.那么要求n个点组成k条链的不同方案数就是求S^k = (x*(1-x/2)/(1-x))^k的多项式展开的第n项的系数,也就是a[n]*x^n/n!,a[n]就是我们要求的,不过最后还要除以k!,因为k条链不需要分先后顺序。

4.S^k = (x*(1-x/2)/(1-x))^k = x^k*(1-x/2)^k*(1/(1-x))^k,此处(1-x/2)^k可以用二项式展开,那么1/(1-x)该如何处理呢,这就用到了上面已经求出的1/(1-x)的多项式,这个多项式所以系数都是1,那么与此多项式相乘得到第n项的系数不就是原多项式的0到n项系数的和吗?

所以(1-x/2)^k的多项式乘一次1/(1-x)得到新的系数,就是求n前系数前缀和,乘k次就是求k次。

5.在k次求前缀和中我们可以直接算出原多项式((1-x/2)^k)的每一项系数对最终结果的贡献。此处列举第1项的系数的贡献T,当k=1时显然T = 1,k = 2时此时所有1到n的项第1项都加上了一次,所以T = k,这个结果就可以想到用组合求解。所以对于求k次前缀和之后原第i项对最终第j项(j>=i)的贡献次数是C(j-i+k-1,k-1)。可以用(C(m,m)+C(m+1,m)+C(m+2,m)+C(m+3,m)+...+C(n,m)==C(n+1,m+1))去推。

6.最后记得乘上(1-x/2)^k上的-1/2的幂啊!求个逆元就行了,还有此多项式的第i项系数就是C(k,i)*(-1/2)^i。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll; 
const int mod = 1e9 + 7;
const int mx = 1e5 + 10;
ll fac[mx],inv[mx];
ll n ,m;
void init()
{
	inv[0] = fac[0] = inv[1] = 1;
	for(int i=1;i<mx;i++) fac[i] = fac[i-1]*i%mod;
	for(int i = 2;i<mx;++i) inv[i] = (mod-mod/i)*inv[mod%i] % mod;
	for(int i=2;i<mx;i++) inv[i] = inv[i]*inv[i-1]%mod;
}
ll C(int x,int y)
{
	return fac[x]*inv[y]%mod*inv[x-y]%mod;
}
int main()
{
	int t;
	init();
	scanf("%d",&t);
	while(t--){
		scanf("%lld%lld",&n,&m);
		if(m>n){
			puts("0");
			continue;
		}
		if(m==n){
			printf("%lld\n",fac[n-1]*inv[2]%mod);
			continue;
		}
		ll ans = 0,base = 1;
		int k = n - m,cnt = min(m,n-m);
		for(int i=0;i<=cnt;i++){
			ans = (ans + C(k,i)*base%mod*C(m-i+k-1,k-1))%mod;
			base = base * -inv[2]%mod;
		}
		ans = (ans+mod)%mod;
		printf("%lld\n",ans*fac[n]%mod*inv[n-m]%mod); 
	}
	return 0;
}

 

标签:系数,个点,ll,int,多项式,ZOJ,4069,2018,inv
From: https://blog.51cto.com/u_12468613/6384496

相关文章

  • 2018-2019 ACM-ICPC Southeastern European Regional Programming Contest (SEERC 201
    题目链接:https://vjudge.net/contest/339284#overview A.Numbers待做B.BrokenWatchs=input()s=s.split("")A,B,C,N=list(map(int,s))n=(N-1)//2ret=N*N*N-3*N*(n)*(n-1)-N-3*N*(N-1)ans=retmod=1<<64if(A==BandB==C):......
  • 2018算法课习题(一)
    目录:数字统计问题2011的倍数最多约数问题最大间隙问题字典序问题金币列阵问题更新中......问题B:数字统计问题(二)时间限制:1Sec  内存限制:128MB提交:8  解决:6[提交][状态][讨论版][命题人:admin]题目描述给定一本书,其中包含n页,计算出书的全部页码中用到了多少个......
  • 2018ACM浙江省赛 ZOJ 4029 Now Loading!!!(二分)
    NowLoading!!!TimeLimit: 1Second     MemoryLimit: 131072KBDreamGridhas  integers .DreamGridalsohas foragivennumber ,where , .InputTherearemultipletestcases.Thefirstlineofinputisaninteger Thefirstlinecon......
  • ZOJ 4020 Traffic Light(走迷宫变形)
    传送门我感觉就是一个走迷宫的题,只不过这个的墙是变化的。但是因为一直在0-1之间转换,所以把走到当前位置的步数进行判断,如果是奇数就把当前位置的灯状态改变,偶数不用处理,然后就是基本的搜索了。#include<bits/stdc++.h>usingnamespacestd;constintmaxn=1e5+10;vector<int>......
  • ZOJ 3960 What Kind of Friends Are You?(模拟)
    传送门给你几个人,然后下i行对应的是回答出来第i个问题的人,最后询问回答出来了哪几个问题的是谁。用一个map,存名字和数字,回答出的问题编号也转化为2进制,然后转化为10进制,这样的话每个人回答出的问题就对应的是一个数字,询问的时候也把2进制的串转化为10进制,这样的话比对就比较方便。......
  • ZOJ 3961 Let's Chat
    传送门给你A的区间和B的区间,然后问你重合的区间。答案就是求重合的区间长度-m+1的值。因为数据量不大,所以就让A的每个区间都对B的区间进行匹配,然后求和就可以了。这就是一种暴力。#include<bits/stdc++.h>usingnamespacestd;constintmaxn=150;typedefpair<int,int>pq;p......
  • ZOJ 3958 Cooking Competition
    传送门也没什么好说的,就根据题意说的写就完事儿了。#include<bits/stdc++.h>usingnamespacestd;intmain(){//freopen("in.txt","r",stdin);cin.tie(0);cout.tie(0);intt,ko,to;cin>>t;while(t--){intn;......
  • ZOJ 3959 Problem Preparation
    传送门根据题目描述写,对于每组给定的数据判断是否满足四个要求就可以了。#include<bits/stdc++.h>usingnamespacestd;intx[120];intmain(){//freopen("in.txt","r",stdin);cin.tie(0);cout.tie(0);intt;cin>>t;while(t--){......
  • Unity2018.2 Standard Assets汉化
    下载中文汉化包拷贝到安装盘:\ProgramFiles\Unity\Editor\Data\Localization下面2018.1+的StandardAssets安装方法“自从我升级到2018.2之后,就再也找不到Unity自带的那些标准资源了,就是那个StandardAssets,里面有好多东西是我的必备资源呢,比如地形的那些贴图,第一人称控制......
  • P4557 [JSOI2018]战争 题解
    闵可夫斯基和前言入门建议看吉老师(吉如一)的计算几何入门到放弃。感觉应该是讲的最通俗易懂的了。本文借鉴了Winxp的博客,以及吉老师视频中的思路。写这篇博客的初衷是因为我作为一个初学者,此题里的题解对我来说理解起来不算太难,但是实现起来细节比较多,题解里也没有很详细地去解......