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. 表单元素(form、文本、按钮、选择)

    表单元素 一.form form代表表单,功能:用于申明表单,定义采集数据的范围,也就是<form>和</form>里面包含的数据将被提交到服务器或者电子邮件里.<for ...

  2. 小程序var that=this

    小程序的js函数中,一般第一句就是var that=this,那么此语句的必要性是什么呢?下面用一段代码来解释这个问题 Page({ //页面的初始数据 loadUsers: function () ...

  3. OpenCVSSDpython目标探测对象检测

    1.请参考大牛博客链接 https://www.aiuai.cn/aifarm822.html

  4. Windows Server 2008 R2英文版修改桌面主题(Win7主题)

    1:首先打开Server Manager(凡是不知道在那里开发均可像Win7一样在运行里面搜索) 2:然后在左边的树形菜单中选择:Feature 点击右边页面中的:Add Features 这时候会出 ...

  5. ES6新用法

    ES6 详细参考页面 简介 ECMAScript和JavaScript的关系是,前者是后者的规格,后者是前者的一种实现.一般来说,这两个词是可以互换的. let命令 ES6新增了let命令,用来声明变 ...

  6. xctf一道反序列化题

    题目地址:http://120.24.86.145:8006/test1/ 右键get源码: <?php $user = $_GET["txt"]; $file = $_GE ...

  7. 从零开始PHP攻略(001)——Bob的汽车零部件商店

    1.创建订单表单 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  8. python基础===列表类型的所有方法

    链表类型有很多方法,这里是链表类型的所有方法: append(x) 把一个元素添加到链表的结尾,相当于a[len(a):] = [x] extend(L) 通过添加指定链表的所有元素来扩充链表,相当于 ...

  9. C json实战引擎 一 , 实现解析部分

    引言 以前可能是去年的去年,写了一个 c json 解析引擎用于一个统计实验数据项目开发中. 基本上能用. 去年在网上 看见了好多开源的c json引擎 .对其中一个比较标准的 cJSON 引擎 深入 ...

  10. [How to] UILocalNotification 的使用

    1.简介 IOS共分为本地和远程通知两种通知,本问介绍本地通知UILocalNotification的基本使用方法. 2.本地通知的实现: 步骤一:新建工程 在Xcode中新建一个single vie ...