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. Spring的使用优点

    spring事物配置,声明式事务管理和基于@Transactional注解的使用 spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者 ...

  2. JqGrid自定义(图片)列

    $("#gridTable").jqGrid({ //...其它属性 colModel: [ //...其它列 { name: , align: "center" ...

  3. 模型验证与模型集成(Ensemble)

    作者:吴晓军 原文:https://zhuanlan.zhihu.com/p/27424282 模型验证(Validation) 在Test Data的标签未知的情况下,我们需要自己构造测试数据来验证 ...

  4. Linux目录结构与文件权限——(五)

    1.目录结构

  5. Django rest framework 的认证流程(源码分析)

    一.基本流程举例: urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^users/', views.HostView.as_view() ...

  6. 配置连接的IP、端口、以及相应的数据库

    解压后里面有:lib 源文件 .examples 例子.test测试 将lib目录拷贝到你的项目中,就可以开始你的predis操作了. //使用autoload加载相关库,这边重点就是为了requir ...

  7. python实战===itchat

    import itchat itchat.login() friends=itchat.get_friends(update=True)[0:] male=female=other=0 for i i ...

  8. C 封装一个通用链表 和 一个简单字符串开发库

    引言 这里需要分享的是一个 简单字符串库和 链表的基库,代码也许用到特定技巧.有时候回想一下, 如果我读书的时候有人告诉我这些关于C开发的积淀, 那么会走的多直啊.刚参加工作的时候做桌面开发, 服务是 ...

  9. SSD算法及Caffe代码详解(最详细版本)

    SSD(single shot multibox detector)算法及Caffe代码详解 https://blog.csdn.net/u014380165/article/details/7282 ...

  10. [How to] 使用Xib来创建view

    1.简介 代码库 正如之前博客介绍的,xib可定义页面的某个部分,特别当此部分区域的view集中并且还有一些相互关联性(如隐藏等)是i特别适合使用xib来进行封装. 本文为[How to]使用自定义c ...