BZOJ2137: submultiple(生成函数,二项式定理)
Description
设函数g(N)表示N的约数个数。现在给出一个数M,求出所有M的约数x的g(x)的K次方和。
Input
第一行输入N,K。N表示M由前N小的素数组成。接下来N行,第i+1行有一个正整数Pi,表示第Ai小的素数 有 Pi次。等式:
Output
输出一个数,表示答案。只需输出最后答案除以1000000007的余数。
Sample Input
1
3
Sample Output
【样例说明】
M=2^1*3^3=54
M的约数有1,2,3,6,9,18,27,54.约数个数分别为1,2,2,4,3,6,4,8.
Answer=1^3+2^3+2^3+4^3+3^3+6^3+4^3+8^3=900
编号 N K Pi<=
1 50 3 10000
2 50 100 10000
3 50 20101125 10000
4 999 17651851 100000
5 5000 836954247 100000
6 4687 1073741823 100000
7 4321 123456789 100000
8 5216 368756432 100000
9 8080 2^31-1 100000
10 10086 3 2^63-1
11 64970 3 2^63-1
12 71321 3 2^63-1
13 350 5 2^31-1
14 250 6 2^31-1
15 110 7 2^31-1
16 99 8 2^31-1
17 80 9 2^31-1
18 70 10 2^31-1
19 60 11 2^31-1
20 50 12 2^31-1
解题思路:
拿到题感觉一脸不可做,反正不是反演的样子。
先来考虑一下样例:
$2^1*3^3=54$
考虑如何将答案分类。将贡献重新累加起来。
首先$g(d)=\sum\limits_{i=1}^{n}{(1+c_i)}$()其中$c_i$为第$i$项的次数)
现在考虑如何将$M$的所有因数表示出来:
以54为例
其中每个因数可以按照2的次数分类,可以是0~1次共有2种选法。
对于每种选法,对应的数中3的次数有0~3共4种选法。
而对应3的每一种选法其答案都是$[(2的次数+1)*(3的次数+1)]^k$
那么这种结果可以看做两个多项式乘积的形式,这两个多项式都是(1+2+3+...)的形式,而由于那个指数上的k是可以带入括号的。
那么答案就变成了$f(54)=(1^3+2^3)*(1^3+2^3+3^3+4^3)=9*100=900$
现在答案就可以解出来了,答案就变成了:
$f(M)=\prod\limits_{i=1}^{n}\sum\limits_{j=1}^{p_i}{j^k}$
n是可以枚举的,对于前45分的点,可以暴力快速幂求解。
剩下的怎么办。
后面的那个高次求和$\sum\limits_{i=1}^{n}{i^k}$是非常公式化的,怎么可能没有公式。
高次求和公式会形如:
$\sum\limits_{i=1}^{n}{i^k}=\sum\limits_{i=1}^{k+1}{a_i*n^i}$
所以可以这样求解(orz zwz):
$a_1x^1+a_2x^2+...+a_{k+1}x^{k+1}+(x+1)^k=a_1(x+1)+a_2(x+1)^2+...+a_{k+1}(x+1)^{k+1}$
二项式定理展开移项:
$\sum\limits_{i=1}^{k+1}{C_i^0x^0}+\sum\limits_{i=2}^{k+1}{C_i^1x^1}+...+\sum\limits_{i=k+1}^{k+1}{C_i^kx^k}=\sum\limits_{i=0}^{k}{C_k^ix^i}$
这个杨辉三角打出矩阵消元就可以解出系数了。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
typedef long long lnt;
const lnt mod=(lnt)(1e9+);
lnt n,k;
lnt maxs;
lnt C[][];
lnt F[];
lnt p[];
lnt a[];
lnt b[][];
lnt c[];
lnt ksm(lnt x,lnt y)
{
lnt ans=;
while(y)
{
if(y&)ans=ans*x%mod;
x=x*x%mod;
y=y/;
}
return ans;
}
lnt squ(lnt x)
{
return x%mod*x%mod;
}
int main()
{
scanf("%lld%lld",&n,&k);
for(int i=;i<=n;i++)
scanf("%lld",&p[i]),
maxs=std::max(p[i],maxs);
if(maxs<=)
{
lnt ans=;
for(int i=;i<=maxs+;i++)F[i]=(F[i-]+ksm(i,k))%mod;
for(int i=;i<=n;i++)ans=(ans*F[p[i]+])%mod;
printf("%lld\n",ans);
return ;
}
if(k==)
{
lnt ans=;
lnt Inv=ksm(,mod-);
for(int i=;i<=n;i++)
ans=ans*squ(p[i]%mod+)%mod*squ(p[i]%mod+)%mod*Inv%mod;
printf("%lld\n",ans);
return ;
}
C[][]=;
for(int i=;i<=k+;i++)
{
C[i][]=;
for(int j=;j<=i;j++)
C[i][j]=(C[i-][j-]+C[i-][j])%mod;
}
for(int i=;i<=k+;i++)
{
for(int j=i;j<=k+;j++)
{
b[i][j]=C[j][i-];
}
}
for(int i=;i<=k+;i++)a[i]=C[k][i-];
for(int i=k+;i>=;i--)
{
a[i]=(a[i]*ksm(b[i][i],mod-))%mod;
for(int j=i-;j;j--)
{
(a[j]-=b[j][i]*a[i]%mod)%=mod;
}
}
lnt ans=;
for(int i=;i<=n;i++)
{
lnt tmp=;
for(int j=;j<=k+;j++)
tmp=(tmp+(a[j]*ksm(p[i]%mod+,j))%mod)%mod;
ans=(ans*tmp)%mod;
}
printf("%lld\n",(ans%mod+mod)%mod);
return ;
}
BZOJ2137: submultiple(生成函数,二项式定理)的更多相关文章
- 2019.01.02 poj1322 Chocolate(生成函数+二项式定理)
传送门 生成函数好题. 题意简述:一个袋子里有ccc种不同颜色的球,现要操作nnn次,每次等概率地从袋中拿出一个球放在桌上,如果桌上有两个相同的球就立刻消去,问最后桌上剩下mmm个球的概率. 第一眼反 ...
- BZOJ 3028: 食物 [生成函数 隔板法 | 广义二项式定理]
3028: 食物 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 497 Solved: 331[Submit][Status][Discuss] De ...
- 【BZOJ2137】submultiple(数论)
[BZOJ2137]submultiple(数论) 题面 BZOJ 题解 首先不难发现答案就是:\(\displaystyle\prod_{i=1}^n (\sum_{j=1}^{p_i+1}j^k) ...
- 【BZOJ2137】submultiple 高斯消元求伯努利数
[BZOJ2137]submultiple Description 设函数g(N)表示N的约数个数.现在给出一个数M,求出所有M的约数x的g(x)的K次方和. Input 第一行输入N,K.N表示M由 ...
- 题解 「BZOJ2137」submultiple
题目传送门 题目大意 给出 \(M,k\) ,求出 \[\sum_{x|M}\sigma(x)^k \] 给出 \(P_i\),满足 \(n=\prod_{i=1}^{n}a_i^{P_i}\),其中 ...
- Nowcoder217D msc的背包 背包、生成函数、组合
传送门 发现这是一个背包问题,而\(k\)又很大,考虑生成函数方式解决这个问题. 对于体积为\(1\)的物品的生成函数为\(\frac{1}{1 - x}\),体积为\(2\)的物品的生成函数为\(\ ...
- BZOJ3028: 食物(生成函数)
题意 链接 Sol 生成函数入门题. 对每个物品分别列一下,化到最后是\(\frac{x}{(1-x)^4}\) 根据广义二项式定理,最后答案是\(C_{(N - 1) + 4 - 1}^{4-1} ...
- 洛谷P2000 拯救世界(生成函数)
题面 题目链接 Sol 生成函数入门题 至多为\(k\)就是\(\frac{1-x^{k+1}}{1-x}\) \(k\)的倍数就是\(\frac{1}{1-x^k}\) 化简完了就只剩下一个\(\f ...
- Codechef CNTL Counting is life 生成函数
传送门--Vjudge 第一问很氵,如果\(K,N\)同奇偶就是\(2^K-1\),否则就是\(2^K-2\) 第二问似乎是可重排列,考虑指数型生成函数. 如何限制某些数必须要出现奇数/偶数次?考虑\ ...
随机推荐
- Mybaties下的分页功能的实现
jsp页面 <!-- 页码 --> <div class="ipRListNav2"> <a href="zyxx.do?findZyxx& ...
- 【甘道夫】Sqoop1.99.3基础操作--导入Oracle的数据到HDFS
第一步:进入clientShell fulong@FBI008:~$ sqoop.sh client Sqoop home directory: /home/fulong/Sqoop/sqoop-1. ...
- MooseFS源代码分析(二)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...
- 47.使用 RequireJS 加载 AngularJS
转自:https://www.cnblogs.com/best/tag/Angular/ AngularJS 目前的版本没有遵循 Javascript 约定的 AMD 模块化规范, 因此使用 Requ ...
- SSRS 报表 报表迁移
数据拷贝下来以后在新的服务器上面还是进行原来的设置 点击报表服务器的连接查看报表服务器列表 这是给每个账户增加访问权限 在主界面点击文件夹设置,给每个角色分配操作报表的权限.,上面那个权限和这个权限都 ...
- View的双击动作
有时在android中需要为某一控件设置双击监听,实现也挺简单,自己动手吧.编码永远不是问题,思路才是最重要. public class DoubleClickDemo extends Activit ...
- bootstrap如何自定义5列
废话少说,先上代码: <!DOCTYPE html><html> <head> <meta charset="utf-8"> < ...
- Spring:dispatchservlet
DispatcherServlet 是 Spring MVC 中负责请求调度的核心引擎,所有的请求将由此 Servlet 根据配置分发至各个逻辑处理单元.其内部同时也维护了一个ApplicationC ...
- laravel 自定义全局函数
在 app 目录下创建一个 Helpers 目录,在此目录下创建文件.这些文件就是全局函数文件.如叫:function.php 加载此文件: 1 . 在 bootstrap/autoload.php ...
- Linux Shell脚本编程-函数
函数介绍 定义:把一段独立功能的的代码当做一个整体,并为之一个名字,命名的代码段,此即为函数: 功能:函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程. 注意: ...