Time Limit: 10 Sec  Memory Limit: 259 MB

Submit: 239  Solved: 113
[Submit][Status][Discuss]

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

2 3
1
3

Sample Output

900
【样例说明】
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

数据范围着实让人头大,,,前九个是一种算法,后11个是一种算法。
先推一下式子:
f(n)= (d|n)∑g(d)^k = πf(pi^ai)=π(g(1)^k+g(pi)^k+...+g(pi^ai)^k)
=π(∑(i=1 to ai+1)i^k)

对数据分治ai小的暴力算出x^k的前缀和,大的高斯消元算出系数再套公式。
至于高斯消元:
先得出 a0+a1*x+a2*x^2+...a(k+1)*x^(k+1)=1^k+2^k+...+x^k,同理可得:
a0+a1*(x+1)+a2*(x+1)^2+...a(k+1)*(x+1)^(k+1)=1^k+...+x^k+(x+1)^k
下式减上式可得:a0*0+a1*(x+1-1)+a2*((x+1)^2-x^2)+....+a(k+1)*((x+1)^(k+1)-x^(k+1))=(x+1)^k
不难发现a0=0(用手指头想想也知道不会带一个常数的,因为0的多少次方都为0),所以带k+1个等式消元就可以把a1-ak+1求出来啦。
再之后就是套公式环节,注意是求(ai +1)的k次方前缀和。

 
#include<bits/stdc++.h>
#define ll long long
#define maxn 100005
#define ha 1000000007
using namespace std;
ll a[maxn],n,k,mx=;
ll ans=,ci[maxn];
ll b[][]; inline ll ksm(ll x,ll y){
ll an=;
for(;y;y>>=,x=x*x%ha) if(y&) an=an*x%ha;
return an;
} inline void work(){
mx++; ll now=;
for(int i=;i<=mx;i++){
ci[i]=ci[i-]+ksm(i,k);
if(ci[i]>=ha) ci[i]-=ha;
} for(int i=;i<=n;i++){
now=now*ci[a[i]+]%ha;
} printf("%lld\n",now);
} inline void solve(){
ll len=k+,now,pre;
for(int i=;i<=len;i++){
now=pre=;
for(int j=;j<=len;j++){
now=now*(i+)%ha;
pre=pre*i%ha;
if(j==k) b[i][len+]=now;
b[i][j]=(now-pre+ha)%ha;
}
} for(int i=;i<=len;i++){
if(!b[i][i]){
for(int j=i+;j<=len;j++) if(b[j][i]){
for(int l=;l<=len+;l++) swap(b[j][l],b[i][l]);
break;
}
} for(int j=i+;j<=len;j++) if(b[j][i]){
ll A=b[i][i],B=b[j][i],C=A/B;
while(B){
C=A/B;
for(int l=i;l<=len+;l++) b[i][l]=(b[i][l]-C*b[j][l]+ha)%ha;
for(int l=i;l<=len+;l++) swap(b[i][l],b[j][l]);
A=b[i][i],B=b[j][i];
}
}
} for(int i=len;i;i--){
ll w=b[i][len+];
for(int j=i+;j<=len;j++) w=(w-b[j][j]*b[i][j]%ha+ha)%ha;
b[i][i]=w*ksm(b[i][i],ha-)%ha;
} for(int i=;i<=n;i++){
ll tot=,now=a[i]%ha+;
for(int j=;j<=len;j++,now=now*((a[i])%ha+)%ha) tot=(tot+b[j][j]*now)%ha;
ans=ans*tot%ha;
} printf("%lld\n",ans);
} int main(){
scanf("%lld%lld",&n,&k);
for(int i=;i<=n;i++){
scanf("%lld",a+i);
mx=max(mx,a[i]);
} if(mx<=){
work();
return ;
} solve();
return ;
}

bzoj 2137: submultiple的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. 【BZOJ2137】submultiple(数论)

    [BZOJ2137]submultiple(数论) 题面 BZOJ 题解 首先不难发现答案就是:\(\displaystyle\prod_{i=1}^n (\sum_{j=1}^{p_i+1}j^k) ...

  3. BZOJ 1500 Luogu P2042 [NOI2005] 维护数列 (Splay)

    手动博客搬家: 本文发表于20180825 00:34:49, 原地址https://blog.csdn.net/suncongbo/article/details/82027387 题目链接: (l ...

  4. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  5. BZOJ 3275: Number

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 874  Solved: 371[Submit][Status][Discus ...

  6. BZOJ 2879: [Noi2012]美食节

    2879: [Noi2012]美食节 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1834  Solved: 969[Submit][Status] ...

  7. bzoj 4610 Ceiling Functi

    bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...

  8. BZOJ 题目整理

    bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...

  9. 【sdoi2013】森林 BZOJ 3123

    Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...

随机推荐

  1. HDU 2553 N皇后问题 (深搜)

    题目链接 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上. 你的任务是,对 ...

  2. poj 1298 The Hardest Problem Ever

    题目链接:http://poj.org/problem?id=1298 题目大意:按照所给的顺序要求将输入的字符串进行排列. #include <iostream> #include &l ...

  3. 重拾Object--(一)初识

    Java中的Object类有着特殊的意义,他是所有其它类的父类,查看Object类的源代码,可以发现代码不多,逻辑也很简单. Java所有类的源代码我们都可以在JDK的文件中查看,在JDK下会有一个名 ...

  4. js获取链接参数

    var url = location.search; var Request = new Object(); if(url.indexOf("?")!=-1){ var str = ...

  5. IT界天才少年:比肩雷军、叫板任正非,自己作死了

    两点之间,走弯路和走直路到达的终点是一样的,而他只是走了弯路,他曾在华为身居高位.后又创业.做投资,完全是不差钱的主. 他跌宕起伏的人生中充满传奇,成功.失败.遗憾.矛盾,每个词都不足以形容他,只有这 ...

  6. centos7系统安装配置

    下载centos7 iso镜像 电脑里面本来有ubuntu系统,直接在u盘做好启动盘安装即可,选择手动分区(忘了),将原本ubuntu系统分区压缩200G.系统不要选择最小化,选择gnome的图形界面 ...

  7. Windows10下配置Linux下C语言开发环境

    今天为大家介绍如在Windows10下配置Linux下C语言开发环境,首先安装linux子系统:启用开发者模式 1.打开设置 2.点击更新和安全3.点击开发者选项 4.启用开发人员模式 5.更改系统功 ...

  8. Linux 入门记录:一、命令行 Bash 的基本操作

    为了以后长期的线上测试和服务器的性能考量,要用 Linux 服务器了.昨晚装了个 CentOS 6.9,今天开始学学 Linux 基础,扫扫盲.ok,小本本记 ing... 一.Shell简介 She ...

  9. python基础===Windows环境下使用pip install 安装出错"Cannot unpack file"解决办法

    不知道为什么,加了豆瓣镜像源还是不行 这个命令可以解决! pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douba ...

  10. C 实现有追求的线程池 后续

    引言 -_- 还是老套路开局 很久以前写过一个有追求的线程池 -> C 实现有追求的线程池 探究 讲述的是一种思路, 并且实现了. 可以一用. 最近在详细搞simplec 框架. 准备发布个正式 ...