首页 > 其他分享 >P4948 数列求和

P4948 数列求和

时间:2023-11-26 22:14:31浏览次数:27  
标签:数列 limits 求和 多项式 sum log Bmatrix P4948 dbinom

传送门

description

给定 \(n,a,k\),求 \(\sum\limits_{i=1}^n a^ii^k\)

  • \(n\leq 10^{18}\)

  • \(k\leq 2\cdot10^3\)

solution

\(k\) 很小,使用第二类斯特林数处理 \(i^k\) 得:

  • \(\sum\limits_{i=1}^n a^i \sum\limits_{j=0} \begin{Bmatrix} k \\ j\end{Bmatrix} \dbinom{i}{j}j!\)

调换求和顺序得:

  • \(\sum\limits_{j=0}^{\min(n,k)} j!\begin{Bmatrix} k\\j \end{Bmatrix} \sum\limits_{i=\min(1,j)}^n a^i \dbinom{i}{j}\)

左边的可以枚举,主要考虑如何计算右边。把 \(k=0\) 特判掉,答案变成 \(i\) 取下界 \(j\) 的答案再 \(-1\)。

记 \(f_{j,n}=\sum\limits_{i=j}^n a^i\dbinom{i}{j}\)。

根据组合数递推式,有:

  • \(f_{j,n}=\sum\limits_{i=j}^n a^i (\dbinom{i-1}{j}+\dbinom{i-1}{j-1})=\sum\limits_{i=j}^n a^i\dbinom{i-1}{j}+\sum\limits_{i=j}^n a^i \dbinom{i-1}{j-1}=af_{j,n-1}+af_{j-1,n-1}\)

设 \(F_n(x)\) 是 \(\{f_{j,n}\}_{j=0}^{+\infty}\) 得生成函数,则有 \(F_{n}(x)=a(x+1)F_{n-1}(x)+1\)。(注意最后这个 \(+1\),是常数项需要特殊处理的,可以把 \(f_{i,j}\) 打表出来就会发现这一点)

于是可以多项式矩阵快速幂求出 \(F_n(x) \pmod {x^{k+1}}\) 了。问题是模数是 1e9+7,\(O(k\log k\log n)\) 在矩阵和任意模数的巨大常数下会很慢,而且代码太复杂。

解决办法是用朴素的多项式乘法代替 NTT,虽然时间复杂度变为 \(O(k^2\log n)\),但是常数小了,也好写。

开 O2 勉强卡过去。

提交记录

当然,也可以对生成函数进行进一步推导,发现需要多项式快速幂 + 多项式求逆。朴素做多项式乘法的话求逆和 \(\ln \exp\) 都是 \(O(k^2)\) 的,所以可以做到 \(O(k^2)\) 的时间复杂度。

_ANIG_ 实现的一份代码的提交记录

标签:数列,limits,求和,多项式,sum,log,Bmatrix,P4948,dbinom
From: https://www.cnblogs.com/FreshOrange/p/17858064.html

相关文章

  • 打印 Fibonacci 数列:
    #include<stdio.h> voidfibonacci(intn){   inti,num1=0,num2=1,nextNum;      printf("Fibonacciseriesupto%dterms:\n",n);      for(i=1;i<=n;++i){       printf("%d,",num1);       nextNum=num1+......
  • 在EXCEL表格中快速自动求和
    在MicrosoftExcel中,可以通过多种方式快速自动求和。以下是一种简单但常用的方法:使用SUM函数选定求和区域:在Excel表格中,首先需要选定要进行求和的区域。这可以是一个列、行或者是一个矩形区域。键入SUM函数:在想要显示总和的单元格中,输入"=SUM("。选择求和区域:然后,用鼠标或......
  • AJAX手写JQuery框架封装AJAX请求和常见方法实现项目功能省市联动查询效果------AJAX
    建立一个SQL表CREATETABLEt_stu(idBIGINTAUTO_INCREMENTPRIMARYKEY,usernameVARCHAR(255),ageINT,addressVARCHAR(255));INSERTINTOt_stu(id,username,age,address)VALUES(NULL,"zhangsan",15,"广州")INSERTINTOt_stu(id,username,age,address)......
  • django 如何查询汇总的求和时避免没有数据导致的错误
    django如何查询汇总的求和时避免没有数据导致的错误在Django中,如果你希望对某个字段进行求和操作,并在没有数据时返回默认值,可以使用aggregate结合Coalesce函数。Coalesce函数用于返回参数中的第一个非空值,这样你可以在没有匹配项时设置默认值。以下是一个示例:fromdjan......
  • P9242 [蓝桥杯 2023 E题] 接龙数列
    P9242[蓝桥杯2023E题]接龙数列一眼LIS但是TLE八个点。发现是sb了,应该用string来存数直接取首位末位。改完50分,TLE五个点。换状态\[F_i$$为以数字$i$结尾的最长接龙数列。则顺推每个数字,从每个数字的首位$F_{j_1}+1$以及末位$F_{j_n}$中取最大转移而来。即......
  • 向量求和
    #include<stdio.h>#include<stdlib.h>#include<string.h>intmain(){ intn,i; chara[200],b[200]; while(scanf("%d",&n)!=EOF){ for(i=0;i<n;i++){  scanf("%d",&a[i]); } for(i=0;i<n;i++){   sc......
  • 实践3:范围内37的倍数求和
    题目描述输入一个整数n,输出小于n并且能被37整除的所有自然数之和。没有则输出0。输入格式一个整数。输出格式一个整数。输入输出样例输入138输出137输入275输出2111说明/提示如输入的值为75,小于75并且能被37整除的自然数为3774。即和为37+74......
  • 试试手气与乘法口诀数列
    7-2试试手气我们知道一个骰子有6个面,分别刻了1到6个点。下面给你6个骰子的初始状态,即它们朝上一面的点数,让你一把抓起摇出另一套结果。假设你摇骰子的手段特别精妙,每次摇出的结果都满足以下两个条件:1、每个骰子摇出的点数都跟它之前任何一次出现的点数不同;2、在......
  • P5154 数列游戏
    题目描述:游戏的规则是这样的:LJC在纸上写下两个长度均为N的数列A和B,两个数列一一对应。HKE每次可以找两个相邻的数A[i]和A[i+1],如果它们两个不互质,HKE可以选择得到(B[i]+B[i+1])分,然后擦掉A和B位置上的第i,i+1个数,并把两个序列重新按顺序编号。当所有相邻的数互质时,游戏结束。HKE......
  • 【洛谷 P1035】[NOIP2002 普及组] 级数求和 题解(循环)
    [NOIP2002普及组]级数求和题目描述已知:。显然对于任意一个整数,当足够大的时候,。现给出一个整数,要求计算出一个最小的,使得。输入格式一个正整数。输出格式一个正整数。样例#1样例输入#11样例输出#12提示【数据范围】对于的数据,。【题目来源】NOIP2002普及组第一题......