首页 > 其他分享 >AT_aising2020_f 题解

AT_aising2020_f 题解

时间:2025-01-10 22:12:25浏览次数:1  
标签:10 le frac 函数 aising2020 题解 ll sum

AT_aising2020_f Two Snuke

题意:对于一个十元组 \((a_1,a_2,b_1,b_2,c_1,c_2,d_1,d_2,e_1,e_2)\) ,定义它合法当且仅当满足下列条件:

  • \(0\le a_1<a_2\)

  • \(0\le b_1<b_2\)

  • \(0\le c_1<c_2\)

  • \(0\le d_1<d_2\)

  • \(0\le e_1<e_2\)

  • \(a_1+a_2+b_1+b_2+c_1+c_2+d_1,d_2+e_1+e_2\le n\)

    现在有 \(T\) 组数据,每次对于给定的 \(n\) 求所有合法十元组 \((a_2-a_1)(b_2-b_1)(c_2-c_1)(d_2-d_1)(e_2-e_1)\) 之和对 \(10^9+7\) 取模的结果。

    \(1\le T\le 100,1\le n\le 10^9\)

\(sol\):首先考虑两两分组,我们定义\(a_1+a_2=n_1,a_2-a_1=m_1\dots e_1+e_2=n_5,e_2-e_1=m_5\) \(DP\) 我们令 \(f_{i,j}\) 表示前 \(i\) 组数和为 \(j\) 的所有合法情况的 \(\prod\limits_{k=1}^i m=1\) 的和,最终答案就是 \(\sum\limits_{i=1}^n f_{5,i}\)。

现在我们考虑一组数和为 \(n_i\)

可以分成 \(0\) 和 \(n_i\) 此时 \(m_i\) 为 \(n_i\)

也可以分成 \(1\) 和 \(n_i-1\) ,此时 \(m_i\) 为 \(n_i-2\)

以此类推,我们可以得到一组数 \(n_i\) 确定时所有情况的 \(m_i\) 呈现等差数列的形式,我们设 \(g_i\) 为一组数和为 \(i\) 时所有情况 \(m\) 的和。需要分两种情况,如果 \(i\) 为奇数,\(g_i=\frac{(i+1)^2}{4}\) ,\(i\) 为偶数时 \(g_i=\frac{k(k+2)}{4}\) 。

然后我们就可以得到一个状态转移式 \(f_{i,j}=\sum\limits_{i=0}^j f_{i-1,j-k}\times g_k\) ,可以观察到如果把 \(f_{i-1}\) 和\(g\) 看作生成函数的话,这个转移就是让 \(f_i\) 等于它们的卷积,并且很显然 \(f_1\) 和 \(g\) 是等价的,所以 \(f_5\) 就相当于 \(g^5\) ,最后答案就是这个生成函数的前缀和。我们可以求出 \(g\) 的封闭形式 \(\frac{x}{(1-x)^2(1-x^2)}\) 所以 \(g^5\) 是 \(\frac{x^5}{(1-x)^{10}(1-x^2)^{5}}\) 。因为要求前缀和所以再乘上 \(\frac1{1-x}\) 最终生成函数卷积出的形式就是 \(\frac{x^5}{(1-x)^{11}(1-x^2)^{5}}\) (有一篇题解似乎也得到了类似的形式,但我没看懂推导过程),\(x^5\) 相当于平移 \(5\) 位比较简单先不管。而 \(\frac1{(1-x)^{11}(1-x^2)^{5}}\) 这玩意第 \(n\) 项系数就是 \(\sum\limits_{k=0}^{\lfloor\frac{n}{2}\rfloor} {k+4\choose4}\times{n-2k+10\choose 10}\) 现在 \(n\) 给定了,\(\sum\) 后面那坨就是关于 \(k\) 的 \(14\) 次函数,求前缀和就是 \(15\) 次函数,直接拉格朗日插值求前 \(\lfloor\frac{n}{2}\rfloor\) 项的和就做完了。

复杂度 \(O(16^2T)\) ,其实可以做到 \(O(16T)\) 但 \(T\) 不是很大所以没什么影响。

一个小问题:

为什么不能直接对 \(f_5\) 做拉插,这里我之前也没想通。其实是因为 \(g\) 要分奇偶所以不是二次函数,而是\(g_i=\frac{(i+1)^2\times((-1)^{i+1}+1)}{4}+\frac{k(k+2)\times((-1)^i+1)}{4}\) 这样指数函数乘二次函数的形式,所以最后卷积出的 \(f_5\) 不是多项式做不了拉插。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
ll fac[100]={1},sum[100],n=50;
inline ll rd()
{
	char c;ll f=1;
	while(!isdigit(c=getchar()))if(c=='-')f=-1;
	ll x=c-'0';
	while(isdigit(c=getchar()))x=x*10+(c^48);
	return x*f;
}
inline ll qp(ll x,ll y)
{
	ll res=1;
	while(y)
	{
		if(y&1) (res*=x)%=mod;
		(x*=x)%=mod,y>>=1;
	}
	return res;
}
ll C(ll n,ll m)
{
	ll s=1;
	for(int i=1;i<=m;i++) (s*=(n-i+1))%=mod;
	return s*qp(fac[m],mod-2)%mod;
}
ll ans(ll k)
{
	if(k<5) return 0;k-=5;
	n=min(50ll,k/2);
	for(int j=0;j<=n;j++)
		sum[j]=C(j+4,4)*C(k-2*j+10,10)%mod;
	k/=2;ll s=0;
	for(int j=1;j<=n;j++) (sum[j]+=sum[j-1])%=mod;
	if(k<=n) return (sum[k]+mod)%mod;
	for(int i=0;i<=n;i++)
	{
		ll s1=sum[i],s2=1;
		for(int j=0;j<=n;j++) if(j!=i)
			s1=s1*(k-j)%mod,s2=s2*(i-j)%mod;
		(s+=s1*qp(s2,mod-2)%mod)%=mod;
	}
	return (s+mod)%mod;
}
int main()
{
	for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
	for(ll t=rd();t--;) printf("%lld\n",ans(rd()));
	return 0;
}

标签:10,le,frac,函数,aising2020,题解,ll,sum
From: https://www.cnblogs.com/Re-Star/p/18664789

相关文章

  • AT_abc248_h [ABC248Ex] Beautiful Subsequences 题解
    题目传送门前置知识树状数组|序列分治解法考虑序列分治,设因\(\max\)和\(\min\)形成的分节点先后为\(k_{1},k_{2}\)。对于\(j\in(mid,k_{1}]\),等价于统计满足\(\max\limits_{h=i}^{mid}\{a_{h}\}-\min\limits_{h=i}^{mid}\{a_{h}\}\lej-i+k\)的\(j\)的......
  • 题解:CF1031F Familiar Operations
    传送门Solution之前有遇到类似的题,第一步先考虑转化操作和问题。对于每个数质因数分解成\(\prod{p_i^{\alpha_i}}\),我们所需要的只有\(\alpha_i\),因为只要求因子个数相同。记其为\(S_i=\{\alpha_1,\alpha_2,\dots,\alpha_k\}\),其中\(\alpha_1\geq\alpha_2\geq\dots......
  • Atcoder ABC329E Stamp 题解 [ 绿 ] [ 线性 dp ]
    Stamp:难点主要在dp转移的细节与分讨上,但通过改变状态设计可以大大简化分讨细节的题。观察首先要有一个观察:只要某一个前缀能被覆盖出来,那么无论它后面多出来多少,后面的字符串都可以帮他重新覆盖回去。这也就是dp为啥没有后效性的原因。除此之外,还要注意一个字符串不仅能在......
  • 跟我一起学 Python 数据处理(二十六):PDF 数据提取技巧与问题解决策略
    跟我一起学Python数据处理(二十六):PDF数据提取技巧与问题解决策略在Python数据处理的学习之旅中,我们已经走过了不少路程,今天继续深入探索PDF文件处理的核心技巧与方法,旨在帮助大家进一步提升数据处理能力,解决实际工作中遇到的难题。一、slate库处理PDF文件的深入......
  • D. Smithing Skill 和 D. Grid Puzzle的题解
    D.SmithingSkill:https://codeforces.com/problemset/problem/1989/D思路:https://blog.csdn.net/weixin_73936404/article/details/140045020(看这位的博客吧,这个本人第一次写卡住了,题解就当复盘了)贪心:优先消耗值小的(花费和返回的差值)且门槛小的。代码:#include<bits/stdc......
  • [NOI2018] 你的名字的题解
    [NOI2018]你的名字Solution:考虑一下\(l=1,r=\left|S\right|\)的时候怎么做,其实比较简单,我们对\(S,T\)都建立出SAM,利用这个求得\(p_i\),表示\(T_{i-p_i+1,i}\)在\(S\)上是一个连续子串,设\(fir_i\)表示\(T\)的SAM中,节点\(i\)代表的\(endpos\)中的最小值(事实上......
  • 一些比赛的题解
    A把第二个字符串反转,然后对于第一个字符串中为#的位置,输出第二个字符串中对应位置的字符即可。B考虑枚举答案(需要注意不能二分),假设当前枚举的答案为\(res\),只需考虑怎么判定该答案是否合法。不难发现,找到\(res\)的不同的两个倍数同时属于这个区间,\(res\)就是合法的。C......
  • G. D-Function 题解 (快速幂, 组合数学)
    原题链接:https://codeforces.com/contest/1985/problem/G题目:思路:要满足D(kn)==kD(n),k与n的每一位相乘都不能发生进位,k只能是一位数。考虑n的位数可能有1e9,所以用到了快速幂。代码:#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintmod......
  • 学校月考题解 #2
    一些闲话期末考,依旧是AK。题解T1有\(n\)个位置。起初每个位置都被封锁。你可以进行以下两种类型的操作:选择一个位置\(i\),其中\(1\leqi\leqn\),然后解除该位置的封锁;选择一对位置\(l\)和\(r\),其中\(1\leql\leqr\leqn\),满足位置\(l\)和\(r\)都已解除封锁,......
  • [BZOJ3159] 决战 题解
    个人感觉各方面难度高于《在美妙的数学王国中畅游》,也不知道是不是求导的关系,这题\(luogu\)难度评级还更低。不过感觉这题作完对\(LCT\)理解更顺畅了。前四个操作简单,关键在第五人格操作。注意力惊人的注意到我们无法像普通\(Splay\)一样,直接对\(LCT\)中的\(Splay\)......