题目

老年选手啥都不想推只能搞个杜教筛了

这个式子长得好吓人啊,所以我们唯一分解之后来考虑这道题

设\(i,j,k\)分别是\(p^a,p^b,p^c\),至于到底谁是谁并不重要,我们不妨假设\(a\leq b\leq c\)

那么\(gcd(i\times j,j\times k,k\times i)=min\{p^{a+b},p^{a+c},p^{b+c}\}=p^{a+b}\)

\(gcd(i,j,k)=min\{p^a,p^b,p^c\}=p^a\)

也就是前面两个柿子乘起来是\(p^{2a+b}\)

我们把后面的柿子分母通分

\[\frac{(i,j)^2+(j,k)^2+(k,i)^2}{(i,j)(j,k)(k,i)}
\]

我们发现分母上还是等于\(p^{2a+b}\),因为\(p^a\)跟另外两个组合得到的\(gcd\)都是\(p^a\),\(p^b\)和\(p^{c}\)的\(gcd\)是\(p^b\),所以分母上是\(p^{2a+b}\)

和外面一约分,没了

显然唯一分解之后各个质数次幂是相互独立的,于是我们现在可以得出结论,我们要求的就是

\[\sum_{i=1}^n\sum_{j=1}^m\sum_{k=1}^p(i,j)^2+(j,k)^2+(k,i)^2
\]

显然可以拆成

\[p\times \sum_{i=1}^n\sum_{j=1}^m(i,j)^2+n\times \sum_{j=1}^m\sum_{k=1}^p(j,k)^2+m\times \sum_{i=1}^n\sum_{k=1}^p(k,i)^2
\]

套路反演我们可以得到我们要求的东西实际上是

\[\sum_{i=1}^n\left \lfloor \frac{n}{i} \right \rfloor\left \lfloor \frac{m}{i} \right \rfloor\sum_{d|i}\mu(\frac{i}{d})d^2
\]

后面的东西线筛也很好推,但是老年选手并不想动脑子了

发现后面的柿子是\(id^2\times \mu\),我们直接杜教筛卷上\(1\)就变成\(id^2\)了,\(id^2\)的前缀和自然是\(\frac{n(n+1)(2n+1)}{6}\)了

这样是\(O(n^{\frac{3}{4}})\)的,但是我们暴力调合级数处理一些,就能跑的很快了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read() {
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int T;
const int I6=166666668;
const int mod=1e9+7;
const int maxn=1e6+1;
int p[maxn>>1],is[maxn],mu[maxn];
int f[20000005],vis[20000005];
inline int calc(int x) {return 1ll*x*(x+1)%mod*(x+x+1)%mod*I6%mod;}
inline int solve(int x) {
if(vis[x]) return f[x];
vis[x]=1;int ans=calc(x);
for(re int l=2,r;l<=x;l=r+1) {
r=x/(x/l);
ans=(ans-1ll*solve(x/l)*(r-l+1)%mod+mod)%mod;
}
return f[x]=ans;
}
inline int work(int n,int m) {
if(n>m) std::swap(n,m);
int ans=0;
for(re int l=1,r;l<=n;l=r+1) {
r=min(n/(n/l),m/(m/l));
ans=(ans+1ll*(n/l)*(m/l)%mod*(solve(r)-solve(l-1)+mod)%mod)%mod;
}
return ans;
}
int main() {
T=read();is[1]=mu[1]=1;
for(re int i=2;i<maxn;i++) {
if(!is[i]) p[++p[0]]=i,mu[i]=-1;
for(re int j=1;j<=p[0]&&p[j]*i<maxn;j++) {
is[p[j]*i]=1;if(i%p[j]==0) break;mu[p[j]*i]=-1*mu[i];
}
}
for(re int i=1;i<maxn;i++)
for(re int j=i;j<maxn;j+=i) {
if(!mu[j/i]) continue;
if(mu[j/i]<0) f[j]=(f[j]-1ll*i*i%mod+mod)%mod;
else f[j]=(f[j]+1ll*i*i)%mod;
}
for(re int i=1;i<maxn;i++)
vis[i]=1,f[i]=(f[i]+f[i-1])%mod;
while(T--) {
int n=read(),m=read(),p=read();
int tmp=1ll*work(n,m)*p%mod+1ll*work(m,p)*n%mod;tmp%=mod;
tmp=(tmp+1ll*work(n,p)*m%mod)%mod;
printf("%d\n",tmp%mod);
}
}

【LGP5176】公约数的更多相关文章

  1. C语言辗转相除法求2个数的最小公约数

    辗转相除法最大的用途就是用来求两个数的最大公约数. 用(a,b)来表示a和b的最大公约数. 有定理: 已知a,b,c为正整数,若a除以b余c,则(a,b)=(b,c). (证明过程请参考其它资料) 例 ...

  2. 求两个数字的最大公约数-Python实现,三种方法效率比较,包含质数打印质数的方法

    今天面试,遇到面试官询求最大公约数.小学就学过的奥数题,居然忘了!只好回答分解质因数再求解! 回来果断复习下,常用方法辗转相除法和更相减损法,小学奥数都学过,很简单,就不细说了,忘了的话可以百度:ht ...

  3. BZOJ4488: [Jsoi2015]最大公约数

    Description 给定一个长度为 N 的正整数序列Ai对于其任意一个连续的子序列{Al,Al+1...Ar},我们定义其权值W(L,R )为其长度与序列中所有元素的最大公约数的乘积,即W(L,R ...

  4. 求N个数的最大公约数和最小公倍数(转)

    除了分解质因数,还有另一种适用于求几个较小数的最大公约数.最小公倍数的方法 下面是数学证明及算法实现 令[a1,a2,..,an] 表示a1,a2,..,an的最小公倍数,(a1,a2,..,an)表 ...

  5. 辗转相除法求最大公约数,非goto

    #include<iostream> using namespace std; //不推荐用goto,当然用它更快 //辗转相除法求两数的最大公约数 int gcd(long int a, ...

  6. ZOJ Problem Set - 1337 Pi 最大公约数

    这道题目的关键在于怎么求两个整数的最大公约数,这里正好复习一下以前的知识,如下: 1.设整数a和b 2.如果a和b都为0,则二者的最大公约数不存在 3.如果a或b等于0,则二者的最大公约数为非0的一个 ...

  7. Euclid求最大公约数

    Euclid求最大公约数算法 #include <stdio.h> int gcd(int x,int y){ while(x!=y){ if(x>y) x=x-y; else y= ...

  8. 洛谷P1372 又是毕业季I&&P1414 又是毕业季II[最大公约数]

    P1372 又是毕业季I 题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚 ...

  9. Java程序设计之最大公约数和最小公倍数

    题目:输入两个正整数number1和number2,求其最大公约数和最小公倍数. 算法:较大数和较小数取余,较小数除余数,一直到余数为0时,为最大公约数(辗转相除法):最大公倍数numbe1*numb ...

随机推荐

  1. U3D Transform用法

    最近在学习unity3d,下面对Transform类做一个小结 一.常用属性和方法 1.1 常用属性: 用代码展示一下上面的一些属性,值得注意的是myCube是mySphere的父物体 using U ...

  2. C# Azure 远程调试

    Azure上的配置 1. 登录我们自己的app,开启远程调试 [远程调试]—> 打开 [远程 Visual Studio 版本] –> 2017,看你是什么版本 这里有点需要注意的是,如果 ...

  3. windows上使用tensorboard

    因为我的环境变量设置的不是python3.5,所以走了一些弯路. 启动tensorboard后,graphs里总是什么都没有 最后再stackoverflow里找到答案 https://stackov ...

  4. MQTT再学习 -- MQTT 客户端源码分析

    MQTT 源码分析,搜索了一下发现网络上讲的很少,多是逍遥子的那几篇. 参看:逍遥子_mosquitto源码分析系列 参看:MQTT libmosquitto源码分析 参看:Mosquitto学习笔记 ...

  5. CLR,GC 表示什么意思?

    CLR常用简写词语,CLR是公共语言运行库(Common Language Runtime)和Java虚拟机一样也是一个运行时环境,它负责资源管理(内存分配和垃圾收集等),并保证应用和底层操作系统之间 ...

  6. VB.NET 窗體操作

    Private Sub A1() '加载窗体 frm1.Show() End Sub Private Sub A2() '離開 Process.GetCurrentProcess().Kill() E ...

  7. blfs(systemv版本)学习笔记-编译安装sudo并创建普通用户配置sudo权限

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! blfs书中sudo的安装配置章节:http://www.linuxfromscratch.org/blfs/view/8.3/ ...

  8. java程序的加载与执行

    1.编写java源文件   .java 2.生成字节码文件   类名.class 3.JRE,java运行环境,包括JVM(java虚拟机).java基本类库 4.

  9. 从零开始学习html(三) 认识标签(第二部分)

    一.使用ul,添加新闻信息列表 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Ty ...

  10. JMeter JMeter自身运行性能优化

    JMeter自身运行性能优化   by:授客 QQ:1033553122 测试环境 apache-jmeter-2.13   1.   问题描述 单台机器的下JMeter启动较大线程数时可能会出现运行 ...