题意简述

给你两个整数\(n\),\(k\),让你求出这个式子

\[\sum_{a_1=1}^n \sum_{a_2=a_1}^n \sum_{a_3=a_2}^n \cdots \sum_{a_k=a_{k-1}}^n \left[ \gcd {(a_1,a_2,a_3\cdots,a_k)} = 1\right]
\]

做法

对于\(\gcd\)进行莫比乌斯反演

\[Ans = \sum_p \mu(p) \sum_{a_1=1}^n \sum_{a_2=a_1}^{\frac{n}{p}} \sum_{a_3=a_2}^{\frac{n}{p}} \cdots \sum_{a_k=a_{k-1}}^{\frac{n}{p}} 1
\]

设\(S(n)= \sum_{a_1=1}^n \sum_{a_2=a_1}^n \sum_{a_3=a_2}^n \cdots \sum_{a_k=a_{k-1}}^n 1\),可以发现

\[S(n)=\sum [1\leq a_1 \leq a_2 \leq \cdots \leq a_k\leq n]=\binom {n+k-1}{k}
\]

所以可得

\[Ans=\sum_p \mu (p) S\left(\frac{n}{p}\right) = \sum_p \mu (p) \binom {\frac{n}{p}+k-1}{k}
\]

杜教筛预处理\(\mu\),整除分块计算\(S\left(\frac{n}{p} \right)\)即可。

代码实现

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define re register int
#define db double
#define in inline
#define rd regitser double
#define ak *
const int N=1e7+5,p=1e9+7,K=1e3+5;
char qwq;
int pri[N>>3];
ll mu[N],inv[N],fac[N],fav[N];
bool vis[N];
unordered_map<ll,ll>smu;
inline int read()
{
re cz=0,ioi=1;qwq=getchar();
while(!isdigit(qwq)) ioi=qwq=='-'?~ioi+1:1,qwq=getchar();
while(isdigit(qwq)) cz=(cz<<3)+(cz<<1)+(qwq^48),qwq=getchar();
return cz ak ioi;
}
in void get()
{
mu[1]=1;
for(re i=2;i<=1e7;i++)
{
if(!vis[i]) pri[++pri[0]]=i,mu[i]=p-1;
for(re j=1;j<=pri[0]&&i*pri[j]<=1e7;j++)
{
vis[i*pri[j]]=1;
if(i%pri[j]==0) {mu[i*pri[j]]=0;break;}
else mu[i*pri[j]]=p-mu[i];
}
}
for(re i=2;i<=1e7;i++) mu[i]=(mu[i]+mu[i-1])%p;
}
in ll qpow(ll x,ll y,ll z=1)
{
for(;y;y>>=1,x=x*x%p) if(y&1) z=z*x%p;
return z;
}
in ll c(ll n,ll m)
{
if(n<=1e7) return fac[n]*inv[n-m]%p*inv[m]%p;
ll ans=1ll;
for(ll i=0;i<m;i++) ans=ans*(n-i)%p;
return ans*inv[m]%p;
}
in ll get_mu(ll n)
{
if(n<=1e7) return mu[n];
if(smu[n]) return smu[n];
ll res=1;
for(ll l=2,r;l<=n;l=r+1)
r=n/(n/l),res=(res-(r-l+1)*get_mu(n/l)%p+p)%p;
return smu[n]=res;
}
int main()
{
get();inv[0]=inv[1]=fav[0]=fac[0]=fac[1]=1;
for(re i=2;i<=1e7;i++) inv[i]=(ll)(p-p/i)*inv[p%i]%p,fac[i]=fac[i-1]*i%p;
for(re i=1;i<=1e7;i++) inv[i]=inv[i-1]*inv[i]%p;
re opt=read();
while(opt--)
{
ll n=read(),k=read();
ll ans=0;
for(ll l=1,r;l<=n;l=r+1)
{
r=n/(n/l);
ans=(ans+(ll)(get_mu(r)-get_mu(l-1)+p)%p*c(n/l+k-1,k)%p)%p;
}
cout<<ans<<endl;
}
return 0;
}

BSOJ5467 [CSPX2017#3]整数 莫比乌斯反演+杜教筛的更多相关文章

  1. 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛

    题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...

  2. [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛)

    [BZOJ 3930] [CQOI 2015]选数(莫比乌斯反演+杜教筛) 题面 我们知道,从区间\([L,R]\)(L和R为整数)中选取N个整数,总共有\((R-L+1)^N\)种方案.求最大公约数 ...

  3. [复习]莫比乌斯反演,杜教筛,min_25筛

    [复习]莫比乌斯反演,杜教筛,min_25筛 莫比乌斯反演 做题的时候的常用形式: \[\begin{aligned}g(n)&=\sum_{n|d}f(d)\\f(n)&=\sum_ ...

  4. 【bzoj4176】Lucas的数论 莫比乌斯反演+杜教筛

    Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目"求Sigma(f(i)),其中1<=i< ...

  5. 【CCPC-Wannafly Winter Camp Day3 (Div1) F】小清新数论(莫比乌斯反演+杜教筛)

    点此看题面 大致题意: 让你求出\(\sum_{i=1}^n\sum_{j=1}^n\mu(gcd(i,j))\). 莫比乌斯反演 这种题目,一看就是莫比乌斯反演啊!(连莫比乌斯函数都有) 关于莫比乌 ...

  6. 51nod 1237 最大公约数之和 V3【欧拉函数||莫比乌斯反演+杜教筛】

    用mu写lcm那道卡常卡成狗(然而最后也没卡过去,于是写一下gcd冷静一下 首先推一下式子 \[ \sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j) \] \[ \sum_{i= ...

  7. [HDU 5608]Function(莫比乌斯反演 + 杜教筛)

    题目描述 有N2−3N+2=∑d∣Nf(d)N^2-3N+2=\sum_{d|N} f(d)N2−3N+2=∑d∣N​f(d) 求∑i=1Nf(i)\sum_{i=1}^{N} f(i)∑i=1N​f ...

  8. 洛谷P3768 简单的数学题 莫比乌斯反演+杜教筛

    题意简述 求出这个式子 \[ \sum_{i=1}^n\sum_{j=1}^n ij(i,j) \bmod p \] 做法 先用莫比乌斯反演拆一下式子 \[ \begin{split} \sum_{i ...

  9. HDU 5608 function(莫比乌斯反演 + 杜教筛)题解

    题意: 已知\(N^2-3N+2=\sum_{d|N}f(d)\),求\(\sum_{i=1}^nf(i) \mod 1e9+7\),\(n\leq1e9\) 思路: 杜教筛基础题? 很显然这里已经设 ...

随机推荐

  1. Delphi XE2 之 FireMonkey 入门(40) - 控件基础: TMemo

    Delphi XE2 之 FireMonkey 入门(40) - 控件基础: TMemo 值得注意的变化: 1.其父类 TScrollBox 的许多特性也很有用处, 如:   Memo1.UseSma ...

  2. 阶段3 1.Mybatis_09.Mybatis的多表操作_7 mybatis多对多准备角色表的实体类和映射配置

    创建Role表和user_role表 DROP TABLE IF EXISTS `role`; CREATE TABLE `role` ( `ID` int(11) NOT NULL COMMENT ...

  3. python学习笔记:(八)条件语句

    if语句,python中if语句的一般形式如下: conditon1为真,执行statement_block_1 condition1为假,判断conition_2,如果condition_2为真,执 ...

  4. TCP中SYN洪水攻击

    在查看TCP标识位SYN时,顺便关注了一下SYN Flood,从网上查阅一些资料加以整理,SYN洪水攻击利用TCP三次握手. 1.SYN洪水介绍 当一个系统(客户端C)尝试和一个提供了服务的系统(服务 ...

  5. if you wanna the rainbow, you have to deal with the rain.

    bulk. n. 大量 reluctant. adj. 不情愿的 terrorist. n. 恐怖分子 recognition. n. 认出 tout.v. 兜售 conceal.v. 隐藏 dras ...

  6. Ubuntu 安装nodejs最新版本

    sudo apt update -y   sudo apt install -y npm   sudo npm config set registry https://registry.npm.tao ...

  7. MySQL-快速入门(1)基本数据库、表操作语句

    1.创建数据库 create database db_name;show create database db_name\G; //查看数据创建语句show databases; //查看当前创建的数 ...

  8. IntelliJ IDLE

    目录 IntelliJ IDLE java项目结构 代码生成 psvm sout 快捷键 更改代码提示快捷键 代码相关快捷键 窗口相关快捷键 Debug快捷键 主题导入 下载主题 导入主题 应用主题 ...

  9. dfs(最佳路径)

    http://acm.hdu.edu.cn/showproblem.php?pid=1242 Rescue Time Limit: 2000/1000 MS (Java/Others)    Memo ...

  10. 通过QT查找Word中的关键字,并做高亮或删除操作

    最近由于项目需要,要用QT操作Word文档.具体的工作需求:在指定的Word文档(*.doc文件/*.docx文件)中查找关键字,找到后做高亮操作或者直接删除操作,然后另存为到别的目录(表示这个文件被 ...