正题

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


题目大意

给出\(n,k\)求

\[\sum_{i_1=1}^n\sum_{i_2=1}^n...\sum_{i_k=1}^ngcd(f_{i_1},f_{i_2},...,f_{i_{k}})
\]

对\(10^9+9\)取模

其中\(f_i\)表示斐波那契数列的第\(i\)项

\(1\leq n,k\leq 10^8\)


解题思路

看上去就很莫比乌斯反演,首先把\(f\)提出来然后直接上莫反就是

\[\sum_{i=1}^nf_{i}\sum_{j=1}^{\lfloor\frac{n}{i}\rfloor}\mu(j)\lfloor\frac{n}{ij}\rfloor^k
\]

这个式子其实就可以直接做了,外面\(f_i\)是一个整除分块,然后里面的式子也是一个整除分块。需要的算法是一个矩阵乘法求斐波那契的前缀和(当然因为\(\sqrt 5\)在\(10^9+9\)下有二次剩余可以直接用特制方程求)还有一个杜教筛求\(\mu\)的前缀和。

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

然后有一个大佬的做法是把上面那个式子化一下

\[\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor^k\sum_{d|i}f_{d}\mu(\frac id)
\]

(相当于外面枚举\(i\times j\)然后枚举它的约数)

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

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

代码的写法是第一种


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. 牛客小白月赛13-J小A的数学题 (莫比乌斯反演)

    链接:https://ac.nowcoder.com/acm/contest/549/J来源:牛客网 题目描述 小A最近开始研究数论题了,这一次他随手写出来一个式子,∑ni=1∑mj=1gcd(i,j ...

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

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

  3. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  4. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  5. 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A

    牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...

  6. 最小生成树--牛客练习赛43-C

    牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 ​ 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...

  7. 牛客练习赛28-B(线段树,区间更新)

    牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ ​ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, ​ 1 l r 询问区间[l,r]内的元素和 ​ 2 l r 询问区间[l,r]内的 ...

  8. 牛客练习赛26:D-xor序列(线性基)

    链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...

  9. [堆+贪心]牛客练习赛40-B

    传送门:牛客练习赛40 题面: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费  x_i 的时间,同时完成第 i 个任务的时间不 ...

随机推荐

  1. Linux虚拟机系统中进行redis的哨兵模式配置

    一.配置步骤 开一台虚拟机1.创建三个redis配置文件:/etc/redis下pidfile "/var/run/redis6380.pid" redis的id号port 638 ...

  2. C#设计模式---迭代器模式(Iterator Pattern)

    一.目的 提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节. 二.定义 迭代器模式提供了一种方法访问一个聚合对象(理解为集合对象)中各个元素,而又无需暴露该对象的内部表示,这样既可 ...

  3. (强制)要求覆写equals必须覆写hashCode(原理分析)

    hashCode和equals hashCode和equals用来标识对象,两个方法协同工作可用来判断两个对象是否相等.众所周知,根据生成的哈希将数据散列开来,可以使存取元素更快.对象通过调用Obje ...

  4. Java随手记录

    Spring @Configuration注解及配置方法 转自:https://www.jb51.net/article/184822.htm Spring @Configuration注解 Spri ...

  5. 1、Spark简介(Python版)

    此文为个人学习笔记如需系统学习请访问http://dblab.xmu.edu.cn/blog/1709-2/ Spark具有如下几个主要特点:  运行速度快    Spark使用先进的DAG(Dir ...

  6. 微信小程序学习笔记一 小程序介绍 & 前置知识

    微信小程序学习笔记一 1. 什么是小程序? 2017年度百度百科十大热词之一 微信小程序, 简称小程序, 英文名 Mini Program, 是一种不需要下载安装即可使用的应用 ( 张小龙对其的定义是 ...

  7. cmd关闭端口占用

    netstat -nao |findStr "8080" taskkill /pid 15406  /f

  8. JS 处理图片平铺问题

    background: url("../../../assets/image/center.png") no-repeat; // 让图片不平铺   overflow: hidde ...

  9. layui的CRUD案列

    用layui来实现一个简单的二级权限和增删改查案列 利用layui提供的组件(table , layer , form,tree)来进行开发 写一个简单的登录界面   根据用户的ID来 获取用户所对应 ...

  10. 比培训机构还详细的 Python 学习路线,你信吗 0^0

    前言 这其实是将自己写的文章进行一个总结分类,并不代表最佳学习路线 会不断更新这篇文章...没链接的文章正在编写ing...会不会哪天我的这个目录就出现在培训机构的目录上了... 目前实战比较少(要是 ...