【LGP5176】公约数
老年选手啥都不想推只能搞个杜教筛了
这个式子长得好吓人啊,所以我们唯一分解之后来考虑这道题
设\(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}\)
我们把后面的柿子分母通分
\]
我们发现分母上还是等于\(p^{2a+b}\),因为\(p^a\)跟另外两个组合得到的\(gcd\)都是\(p^a\),\(p^b\)和\(p^{c}\)的\(gcd\)是\(p^b\),所以分母上是\(p^{2a+b}\)
和外面一约分,没了
显然唯一分解之后各个质数次幂是相互独立的,于是我们现在可以得出结论,我们要求的就是
\]
显然可以拆成
\]
套路反演我们可以得到我们要求的东西实际上是
\]
后面的东西线筛也很好推,但是老年选手并不想动脑子了
发现后面的柿子是\(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】公约数的更多相关文章
- C语言辗转相除法求2个数的最小公约数
辗转相除法最大的用途就是用来求两个数的最大公约数. 用(a,b)来表示a和b的最大公约数. 有定理: 已知a,b,c为正整数,若a除以b余c,则(a,b)=(b,c). (证明过程请参考其它资料) 例 ...
- 求两个数字的最大公约数-Python实现,三种方法效率比较,包含质数打印质数的方法
今天面试,遇到面试官询求最大公约数.小学就学过的奥数题,居然忘了!只好回答分解质因数再求解! 回来果断复习下,常用方法辗转相除法和更相减损法,小学奥数都学过,很简单,就不细说了,忘了的话可以百度:ht ...
- BZOJ4488: [Jsoi2015]最大公约数
Description 给定一个长度为 N 的正整数序列Ai对于其任意一个连续的子序列{Al,Al+1...Ar},我们定义其权值W(L,R )为其长度与序列中所有元素的最大公约数的乘积,即W(L,R ...
- 求N个数的最大公约数和最小公倍数(转)
除了分解质因数,还有另一种适用于求几个较小数的最大公约数.最小公倍数的方法 下面是数学证明及算法实现 令[a1,a2,..,an] 表示a1,a2,..,an的最小公倍数,(a1,a2,..,an)表 ...
- 辗转相除法求最大公约数,非goto
#include<iostream> using namespace std; //不推荐用goto,当然用它更快 //辗转相除法求两数的最大公约数 int gcd(long int a, ...
- ZOJ Problem Set - 1337 Pi 最大公约数
这道题目的关键在于怎么求两个整数的最大公约数,这里正好复习一下以前的知识,如下: 1.设整数a和b 2.如果a和b都为0,则二者的最大公约数不存在 3.如果a或b等于0,则二者的最大公约数为非0的一个 ...
- Euclid求最大公约数
Euclid求最大公约数算法 #include <stdio.h> int gcd(int x,int y){ while(x!=y){ if(x>y) x=x-y; else y= ...
- 洛谷P1372 又是毕业季I&&P1414 又是毕业季II[最大公约数]
P1372 又是毕业季I 题目背景 “叮铃铃铃”,随着高考最后一科结考铃声的敲响,三年青春时光顿时凝固于此刻.毕业的欣喜怎敌那离别的不舍,憧憬着未来仍毋忘逝去的歌.1000多个日夜的欢笑和泪水,全凝聚 ...
- Java程序设计之最大公约数和最小公倍数
题目:输入两个正整数number1和number2,求其最大公约数和最小公倍数. 算法:较大数和较小数取余,较小数除余数,一直到余数为0时,为最大公约数(辗转相除法):最大公倍数numbe1*numb ...
随机推荐
- 【学习笔记】深入理解async/await
参考资料:理解javaScript中的async/await,感谢原文作者的总结,本文在理解的基础上做了一点小小的修改,主要为了加深自己的知识点掌握 学完了Promise,我们知道可以用then链来解 ...
- JavaScript跨域解决方式
平时工作中经常被JavaScript跨域问题所困扰,其实有很多种解决方式,下面给大家介绍常用的几种: 1.jsonp解决跨域问题 客户端代码: <!DOCTYPE html> <ht ...
- [Cerc2012]Non-boring sequences
Description 定义一个序列是不无聊的,当且仅当它的所有子区间都存在一个独一无二的数字,即每个子区间里至少存在一个数字只出现过一次.给定一个长度为\(N(N\leq2\times 10^5)\ ...
- C++ 日期 & 时间
C++ 标准库没有提供所谓的日期类型.C++ 继承了 C 语言用于日期和时间操作的结构和函数. 为了使用日期和时间相关的函数和结构,需要在 C++ 程序中引用 头文件. 有四个与时间相关的类型:clo ...
- [转]Angular 2 / 4 / 5 not working in IE11
本文转自:https://stackoverflow.com/questions/35140718/angular-2-4-5-not-working-in-ie11/47777695#4777769 ...
- Matlab disp()
matlab中disp()就是屏幕输出函数,类似于c语言中的printf()函数
- 通过jQuery制作电子时钟表的代码
源码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <titl ...
- 网络安全之sql注入
1.何为Sql注入? 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.具体来说,它是利用现有应用程序,将(恶意的)SQ ...
- Python shelve
shelve模块只有一个open函数,返回类似字典的对象,可读可写; key必须为字符串,而值可以是python所支持的数据类型. import shelve f = shelve.open('SHE ...
- python中的清屏函数
一:cmd中python的清屏函数 import os os.system("cls") cmd中演示 1.在cmd中输入命令行: 2.执行后: 3.为什么会遗留一个0? 因为函数 ...