HDU 5628 Clarke and math Dirichlet卷积+快速幂
题意:bc round 72 中文题面
分析(官方题解):
如果学过Dirichlet卷积的话知道这玩意就是g(n)=(f*1^k)(n),
由于有结合律,所以我们快速幂一下1^k就行了。
当然,强行正面刚和式也是能搞的(反正我不会)。
一次Dirichlet卷积复杂度是O(nlogn)的,所以总时间复杂度为O(nlognlogk).
注:普及Dirichlet卷积概念,设f,g为两个数论函数,
那么规定 (f∗g)=∑d|nf(d)g(n/d)为f,g的Dirichlet卷积
Dirichlet卷积有以下性质,有交换律和结合律,对加法有分配律
f∗(g∗h)=(f∗g)∗h
f∗(g+h)=f∗g+f∗h
f∗g=g∗f
然后对于这个题解上所说的一次Dirichlet卷积是O(nlogn)这个我不是很懂
但是看网上大神写的估计也差不多,感觉和埃氏筛的复杂度差不多甚至还要小应该是在O(nlognlogn)左右
所以下面的代码的复杂度大概应该是O(nlog^2nlogk)
然后顺带提一下,对于Dirichlet卷积来说,规定有一个幺元e的话
即:f*e=f,
这个幺元函数有一个性质e[1]=1,e[k]=0,k=1,2,3.....
这个在快速幂的时候会用到
然后上代码
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long LL;
const int N=1e5+;
const LL mod=1e9+;
int n,k;
LL f[N],s[N],ans[N],tmp[N];
void solve()
{
while(k)
{
if(k&)
{
for(int i=; i<=n; ++i)tmp[i]=;
for(int i=; i*i<=n; ++i)
{
tmp[i*i]=(tmp[i*i]+ans[i]*s[i])%mod;
for(int j=i+; j*i<=n; ++j)
tmp[i*j]+=(ans[i]*s[j]%mod+ans[j]*s[i]%mod)%mod,tmp[i*j]%=mod;
}
for(int i=; i<=n; ++i)ans[i]=tmp[i];
}
for(int i=; i<=n; ++i)tmp[i]=;
for(int i=; i*i<=n; ++i)
{
tmp[i*i]=(tmp[i*i]+s[i]*s[i])%mod;
for(int j=i+; j*i<=n; ++j)
tmp[i*j]+=(s[i]*s[j]%mod+s[j]*s[i]%mod)%mod,tmp[i*j]%=mod;
}
for(int i=;i<=n;++i)s[i]=tmp[i];
k>>=;
}
for(int i=; i<=n; ++i)tmp[i]=;
for(int i=; i*i<=n; ++i)
{
tmp[i*i]=(tmp[i*i]+f[i]*ans[i])%mod;
for(int j=i+; j*i<=n; ++j)
tmp[i*j]+=(f[i]*ans[j]%mod+f[j]*ans[i]%mod)%mod,tmp[i*j]%=mod;
}
for(int i=;i<=n;++i)ans[i]=tmp[i];
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&k);
for(int i=; i<=n; ++i)
scanf("%I64d",&f[i]),s[i] = ,ans[i] = ;
ans[] = ;
solve();
for(int i=; i<n; ++i)
printf("%I64d ",ans[i]);
printf("%I64d\n",ans[n]);
}
return ;
}
HDU 5628 Clarke and math Dirichlet卷积+快速幂的更多相关文章
- HDU.5628.Clarke and math(狄利克雷卷积 快速幂)
\(Description\) \[g(i)=\sum_{i_1|i}\sum_{i_2|i_1}\sum_{i_3|i_2}\cdots\sum_{i_k|i_{k-1}}f(i_k)\ mod\ ...
- HDU 5628 Clarke and math——卷积,dp,组合
HDU 5628 Clarke and math 本文属于一个总结了一堆做法的玩意...... 题目 简单的一个式子:给定$n,k,f(i)$,求 然后数据范围不重要,重要的是如何优化这个做法. 这个 ...
- HDU 5628 Clarke and math dp+数学
Clarke and math 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5628 Description Clarke is a patient ...
- HDU 1757 A Simple Math Problem (矩阵快速幂)
题目 A Simple Math Problem 解析 矩阵快速幂模板题 构造矩阵 \[\begin{bmatrix}a_0&a_1&a_2&a_3&a_4&a ...
- hdu 1757 A Simple Math Problem_矩阵快速幂
题意:略 简单的矩阵快速幂就行了 #include <iostream> #include <cstdio> #include <cstring> using na ...
- hdu 5187 zhx's contest [ 找规律 + 快速幂 + 快速乘法 || Java ]
传送门 zhx's contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- HDU 2855 斐波那契+矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=2855 化简这个公式,多写出几组就会发现规律 d[n]=F[2*n] 后面的任务就是矩阵快速幂拍一个斐波那契模板出 ...
- HDU 5950:Recursive sequence(矩阵快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:给出 a,b,n,递推出 f(n) = f(n-1) + f(n-2) * 2 + n ^ 4. f ...
- HDU1757 A Simple Math Problem 矩阵快速幂
A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
随机推荐
- python总字符串
前面我们讲解了什么是字符串.字符串可以用''或者""括起来表示. 如果字符串本身包含'怎么办?比如我们要表示字符串 I'm OK ,这时,可以用" "括起来表示 ...
- drag drop小游戏
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- 手写快速排序(QuickSort)
#include<iostream> #include<stdio.h> #include<algorithm> using namespace std; int ...
- 深入浅出百度地图API开发系列(3):模块化设计
在前面两张简单介绍了百度地图API的基础知识和使用之后,我们来分析一下百度地图API的基本架构,了解一下基本架构可以帮助我们更清晰的了解API的功能和调用过程,也就可以帮助我们在实际开发中可以更方便的 ...
- js按钮点击展开收起
$('.tab').click(function(){ var index = $('.tab').index(this), //缓存第一次点击的li的索引值 ele = $(this).find(' ...
- The 7th Zhejiang Provincial Collegiate Programming Contest->Problem G:G - Wu Xing
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3328 至今未看懂题意,未编译直接提交,然后 A了.莫名AC总感觉怪怪的. ...
- grep正则表达式后面的单引号和双引号的区别
单引号''是全引用,被单引号括起的内容不管是常量还是变量者不会发生替换:双引号""是部分引用,被双引号括起的内容常量还是常量,变量则会发生替换,替换成变量内容! 一般常量用单引号' ...
- hdu 3537 Daizhenyang's Coin 博弈论
详见:http://www.cnblogs.com/xin-hua/p/3255985.html 约束条件6 代码如下: #include<iostream> #include<st ...
- 多线程 (四)GCD
学习GCD要掌握几个概念 任务:需要执行的代码块可以看作一个任务 队列:把任务放到队列里,遵循先进先出的原则 队列又分为串行队列和并行队列 串行队列:顺序执行 并发队列:同时执行多个任务 同步:在当前 ...
- 借助CAD在Altium Designer中定义不规则PCB外形
借助绘图软件CAD在Altium Designer中定义不规则PCB外形. 工具/原料 CAD2007 Altium Designer2015 方法/步骤 借助CAD绘制的不规则外形,保存成DXF格式 ...