正题

题目链接:https://ac.nowcoder.com/acm/contest/11174/F


题目大意

给出n,kn,kn,k求
∑i1=1n∑i2=1n...∑ik=1ngcd(fi1,fi2,...,fik)\sum_{i_1=1}^n\sum_{i_2=1}^n...\sum_{i_k=1}^ngcd(f_{i_1},f_{i_2},...,f_{i_{k}})i1​=1∑n​i2​=1∑n​...ik​=1∑n​gcd(fi1​​,fi2​​,...,fik​​)
对109+910^9+9109+9取模

其中fif_ifi​表示斐波那契数列的第iii项

1≤n,k≤1081\leq n,k\leq 10^81≤n,k≤108


解题思路

看上去就很莫比乌斯反演,首先把fff提出来然后直接上莫反就是
∑i=1nfi∑j=1⌊ni⌋μ(j)⌊nij⌋k\sum_{i=1}^nf_{i}\sum_{j=1}^{\lfloor\frac{n}{i}\rfloor}\mu(j)\lfloor\frac{n}{ij}\rfloor^ki=1∑n​fi​j=1∑⌊in​⌋​μ(j)⌊ijn​⌋k
这个式子其实就可以直接做了,外面fif_ifi​是一个整除分块,然后里面的式子也是一个整除分块。需要的算法是一个矩阵乘法求斐波那契的前缀和(当然因为5\sqrt 55​在109+910^9+9109+9下有二次剩余可以直接用特制方程求)还有一个杜教筛求μ\muμ的前缀和。

因为整除分块套整除分块的复杂度是O(n34)O(n^{\frac{3}{4}})O(n43​),然后最里面套个杜教筛复杂度不会大很多所以能过。

然后有一个大佬的做法是把上面那个式子化一下
∑i=1n⌊ni⌋k∑d∣ifdμ(id)\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor^k\sum_{d|i}f_{d}\mu(\frac id)i=1∑n​⌊in​⌋kd∣i∑​fd​μ(di​)
(相当于外面枚举i×ji\times ji×j然后枚举它的约数)

然后因为μ∗I=ϵ\mu*I=\epsilonμ∗I=ϵ,所以f∗μ∗I=f∗ϵ=ff*\mu*I=f*\epsilon=ff∗μ∗I=f∗ϵ=f。所以如果在能快速求fff的前缀和的情况下求f∗μf*\muf∗μ的前缀和可以用杜教筛来做。

然后上面那个式子整除分块一下就好了

代码的写法是第一种


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;
const ll N=5e6+10,S=3,P=1e9+9;
struct Matrix{ll a[S][S];
}c,f,am;
ll n,k,ans,cnt,mu[N],pri[N/10];
bool v[N];map<ll ,ll >mp;
Matrix operator*(Matrix &a,Matrix &b){memset(c.a,0,sizeof(c.a));for(ll i=0;i<S;i++)for(ll j=0;j<S;j++)for(ll k=0;k<S;k++)(c.a[i][j]+=a.a[i][k]*b.a[k][j]%P)%=P;return c;
}
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
ll Fbi(ll b){memset(f.a,0,sizeof(f.a));am.a[0][0]=am.a[0][2]=0;am.a[0][1]=1;f.a[2][2]=1;f.a[0][1]=1;f.a[1][1]=1;f.a[1][0]=1;f.a[1][2]=1;while(b){if(b&1)am=am*f;f=f*f;b>>=1; }return am.a[0][2];
}
void Prime(){mu[1]=1;for(ll i=2;i<N;i++){if(!v[i])pri[++cnt]=i,mu[i]=-1;for(ll j=1;j<=cnt&&i*pri[j]<N;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break;mu[i*pri[j]]=-mu[i];}}for(ll i=1;i<N;i++)mu[i]+=mu[i-1];return;
}
ll GetMu(ll n){if(n<N)return mu[n];if(mp[n])return mp[n];ll ans=1;for(ll l=2,r;l<=n;l=r+1)r=n/(n/l),ans=ans-(r-l+1)*GetMu(n/l);return mp[n]=ans;
}
ll g(ll n){ll ans=0;for(ll l=1,r;l<=n;l=r+1){r=n/(n/l);ll tmp=GetMu(r)-GetMu(l-1);ans=(ans+tmp*power(n/l,k)%P)%P;}return ans;
}
signed main()
{Prime();scanf("%lld%lld",&n,&k);for(ll l=1,r;l<=n;l=r+1){r=n/(n/l);ll tmp=Fbi(r)-Fbi(l-1);ans=(ans+tmp*g(n/l)%P)%P;}printf("%lld\n",(ans+P)%P);return 0;
}

牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】相关推荐

  1. 牛客P19836 裴蜀定理+莫比乌斯反演+杜教筛

    题意: 一开始一个人在原点,它拥有 n n n个整数 x i x_{i} xi​,并且 x i ∈ [ 1 , m ] x_{i}\in[1,m] xi​∈[1,m],他每次可以选择一个 x i x_ ...

  2. 牛客练习赛89--牛牛防疫情

    牛牛防疫情 题意: 牛牛用卖烤串赚的钱买了一款游戏,这款游戏的地图是一个 n*n 的网格,其中有 m 个地区存在感染源(红色),其余地区为安全区(白色).已知一个感染源可同时将与其相邻(上下左右)的安 ...

  3. 牛客练习赛89E-牛牛小数点【数论】

    正题 题目链接:https://ac.nowcoder.com/acm/contest/11179/E 题目大意 定义f(x)f(x)f(x)表示1x\frac{1}{x}x1​的混循环节长度(如果没 ...

  4. 牛客练习赛63---牛牛的树行棋

    牛牛的树行棋 (树形sg函数) 题意如上 思路: 很好的一道树上博弈...首先需要看出来是sg博弈(并且知道sg博弈) 知道之后 如果能猜到sg函数的表示就差不多啦,结论是:sg[x]=到达子树中最深 ...

  5. 牛客练习赛67 牛妹的苹果树

    题意:输出给定的点序号区间中两点间距离的最大值 思路: 考虑倍增思想,st[u][i] 代表从u号节点开始往后2^i个连续数中的直径的两个端点. st[u][i] 一定是由 st[u][i-1] 和 ...

  6. 牛客练习赛29 题解

    牛客练习赛29 A. 可持久化动态图上树状数组维护01背包 题解 这题跟标题没有任何关系- 贪心的使得负数删除的时候下标尽可能大,然后正数的时候下标尽可能小. 观察到每个数下标最大的时候就是它的初始下 ...

  7. 牛客练习赛27 B 手办

    题意 给你一个n 定义f(x)为a*b整除x的(a,b)个数 求f(1)+f(2)+-+f(n) 废话 好久没有更博客了.. 其实都是写了没有发出来.. 你问我为什么不发出来? 因为写得都很简略..类 ...

  8. 牛客练习赛81 E. 小 Q 与函数求和 1( “简单莫比乌斯反演” ,欧拉函数性质)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 牛客练习赛81 E. 小 Q 与函数求和 1( "简单莫比乌斯反演" ) Prob ...

  9. 解题报告(一)C、(牛客练习赛41 F)简单数学题(数论 + FWT)(3.5)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

最新文章

  1. One Day-XML:XSLT
  2. hdu 2988 Strange fuction【模拟退火】
  3. BDC技术(一个例子)
  4. 使用Spring Cloud休息客户电话
  5. java的国际化怎么用_Java有关国际化使用实例
  6. 信息学奥赛一本通 1149:最长单词2 | OpenJudge NOI 1.13 16
  7. libtorch和torchvision的编译安装
  8. DevOps组织中应用架构师的新定位与实践
  9. matlab有限差分法编程波导_有限差分法的Matlab程序
  10. 漫画:如何给女朋友解释为什么200M宽带,打王者荣耀还是会有460的延迟?
  11. 关于如何将DB2中的非空约束删除
  12. python让繁琐工作自动化 第12章 web页面抓取
  13. android编辑keynote,Keynote添加和编辑母版幻灯片
  14. 基于TCP/UDP的NIO服务端/客户端代码实现damo(java)
  15. 英语NLP词汇类别列表
  16. 在Google使用Borg进行大规模集群的管理 7-8
  17. 基于JAVA的校园论坛系统设计与实现
  18. 绪言 前端性能的重要性 HTTP概述
  19. linux搭建ftps(vsftpd),java代码测试上传下载
  20. xsmax 拨号失败服务器无响应,加载资源失败:服务器响应状态为404(未找到)和nodejs...

热门文章

  1. oracle与sqlserver差异,Oracle与SQLServer的SQL语法差异总结
  2. python地理空间分析指南pdf邓世超_Python地理空间分析指南(第2版)源代码.zip
  3. python静态变量和静态方法_python的静态成员变量、实例成员变量、静态方法、类方法、实例方法...
  4. okcoinapi开发代码_比特币程序化交易入门(5):WebSocket API
  5. ci mysql高并发_高并发访问mysql时的问题(一):库存超减
  6. 51单片机除c语言 中断嵌套,关于51系列单片机中断嵌套 - 关于单片机中断嵌套总结...
  7. 移动端h5唤起键盘_移动端H5界面打开后,如何自动调用软键盘
  8. 蓝桥杯2017初赛-分巧克力-二分
  9. linux技术笔记(常用命令)持续更新中。。。
  10. 英语期末复习unit 3-4课后习题第一题及背诵段落