求∑1<=i<=n1<=j<=ngcd(i,j) % P

P = 10^9 + 7

2 <= n <= 10^10

这道题,明显就是杜教筛

推一下公式:

利用∑d|nphi(d) = n

ans = ∑1<=i<=n1<=j<=nd|(i,j)phi(d)

= ∑1<=d<=n1<=i<=n1<=j<=n[d|(i,j)]phi(d)

= ∑1<=d<=nphi(d)∑1<=i<=n1<=j<=n[d|(i,j)]

= ∑1<=d<=nphi(d)(n / d) * (n / d)

= ∑1<=i<=nphi(i) * (n / i) * (n / i)

这样我们就可以把i按照(n / i)分成sqrt(n)段,假如此时x = n / i,r = n / x

则[i,r]这段的(n / i)都为x,则此时的贡献为x * x * ∑i<=j<=rphi(j)

这样的我们对于每一段,我们需要算[i,r]这一段的phi函数之和

令g(n) = ∑1<=i<=nphi(i)

则我们需要算的是g(r) - g(i - 1)

那怎么算g(r)呢?因为这个时候r可能非常大

我们知道:

g(n) = n * (n + 1) / 2 - ∑2<=i<=ng(n / i)

所以我们可以在O(n^(2/3))内等到g(n)

本来我以为这样需要算sqrt(n)段,每一段最坏是O(n^(2/3)),所以时间复杂度是不行的,

但是试写一下代码,交后,发现跑的很快,大概是有很多段的g都可以很快的求出来???

我这里也不会算复杂度。。。

代码:

  //File Name: nod1237.cpp
//Created Time: 2017年01月04日 星期三 00时47分02秒 #include <bits/stdc++.h>
#define LL long long
using namespace std;
const int MAXN = (int)2e7 + ;
const int P = (int)1e9 + ;
bool check[MAXN];
int prime[MAXN / ];
LL g[MAXN],inv_2;
map<LL,LL> rem;
void init(int n){
int tot = ;
g[] = ;
memset(check,false,sizeof(check));
for(int i=;i<=n;++i){
if(!check[i]){
prime[tot++] = i;
g[i] = i - ;
}
for(int j=;j<tot;++j){
if((LL)i * prime[j] > n) break;
check[i * prime[j]] = true;
if(i % prime[j] == ){
g[i * prime[j]] = g[i] * prime[j] % P;
break;
}
else{
g[i * prime[j]] = g[i] * (prime[j] - ) % P;
}
}
}
for(int i=;i<=n;++i)
g[i] = (g[i] + g[i - ]) % P;
}
LL cal_g(LL n){
if(n < MAXN) return g[n];
if(rem.count(n)) return rem[n];
LL res = (n % P) * ((n + ) % P) % P * inv_2 % P;
for(LL i=,x,r;i<=n;){
x = n / i;
r = n / x;
res = (res - (r - i + ) % P * cal_g(x) % P + P) % P;
i = r + ;
}
rem[n] = res;
return res;
}
LL solve(LL n){
init(min(n,MAXN - 1LL));
LL res = ;
for(LL i=,x,r;i<=n;){
x = n / i;
r = n / x;
res = (res + (x % P) * (x % P) % P * (cal_g(r) - cal_g(i - ) + P) % P) % P;
i = r + ;
}
return res;
}
LL qp(LL x,LL y){
LL res = ;
for(;y>;y>>=){
if(y & ) res = res * x % P;
x = x * x % P;
}
return res;
}
int main(){
inv_2 = qp(,P - );
LL n;
scanf("%lld",&n);
printf("%lld\n",solve(n));
return ;
}

51nod 1237 最大公约数之和 V3的更多相关文章

  1. 51NOD 1237 最大公约数之和 V3 [杜教筛]

    1237 最大公约数之和 V3 题意:求\(\sum_{i=1}^n\sum_{j=1}^n(i,j)\) 令\(A(n)=\sum_{i=1}^n(n,i) = \sum_{d\mid n}d \c ...

  2. 51nod 1237 最大公约数之和 V3(杜教筛)

    [题目链接] https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1237 [题目大意] 求[1,n][1,n]最大公约数之和 ...

  3. 51Nod.1237.最大公约数之和 V3(莫比乌斯反演 杜教筛 欧拉函数)

    题目链接 \(Description\) \(n\leq 10^{10}\),求 \[\sum_{i=1}^n\sum_{j=1}^ngcd(i,j)\ mod\ (1e9+7)\] \(Soluti ...

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

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

  5. 51nod 237 最大公约数之和 V3 杜教筛

    Code: #include <bits/stdc++.h> #include <tr1/unordered_map> #define setIO(s) freopen(s&q ...

  6. [51Nod 1237] 最大公约数之和 (杜教筛+莫比乌斯反演)

    题目描述 求∑i=1n∑j=1n(i,j) mod (1e9+7)n<=1010\sum_{i=1}^n\sum_{j=1}^n(i,j)~mod~(1e9+7)\\n<=10^{10}i ...

  7. 51nod 1040 最大公约数之和(欧拉函数)

    1040 最大公约数之和 题目来源: rihkddd 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题   给出一个n,求1-n这n个数,同n的最大公约数的和.比如: ...

  8. 51nod 1040 最大公约数之和 欧拉函数

    1040 最大公约数之和 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 Description 给 ...

  9. 51nod 1040 最大公约数之和

    给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15   Input 1个数N(N <= ...

随机推荐

  1. 调用接口传递的XML 及排查原因

    2fq3ej15nv8fgns30firbqtlo3 <Interface type="edit" model="object" value=" ...

  2. esrdtfyghjk

    两融余额止跌回升,金融股回落飘绿,千股涨停续演,沪指收复4000点未果涨逾2% 相关报道 [今日收盘]灾后重建激情抢筹 大盘两日反弹500点 [今日收盘]沪指涨近6%重回3700点 未停牌个股九成涨停 ...

  3. formValidator 表单验证

    作为一名程序员,在解决工作中遇到问题之后,做一些总结是有必要的,既方便总结温习相关知识点,也为广大的程序员提供了一些工作经历,给予同行一面明鉴. 首先,众所周知的,我们需要引用js类库: eg:< ...

  4. 【 D3.js 进阶系列 — 6.1 】 缩放的应用(Zoom)

    缩放(Zoom)是另一种重要的可视化操作,主要是使用鼠标的滚轮进行. 1. zoom 的定义 缩放是由 d3.behavior.zoom() 定义的. var zoom = d3.behavior.z ...

  5. sqlite3无法找到

    在DDMS窗口的File Explorer面板下展开system > xbin 看到sqlite3 ,点击右上角的软盘图标(pull a file from the device) 将其保存到其 ...

  6. Jquery 点击图片在弹出层显示大图

    http://blog.csdn.net/wongwaidah/article/details/28432427(案例链接出处,本人只是转载收藏) <html> <head> ...

  7. 过滤emoji表情

    str=str.replace(/\ud83c[\udf00-\udfff]|\ud83d[\udc00-\ude4f]|\ud83d[\ude80-\udeff]/g, "");

  8. web view调h5的方法死活调不到

    (WebViewJavascriptBridge注册方法都能调用,只有callhandlename时无论如何也没响应)这个问题真是纠缠我好久了 webview评论区刷新问题终于找到原因了 ,我试着把咨 ...

  9. 王爽<<汇编语言>> 实验十四

    ;以"年/月/日 时:分:秒"的格式, 显示当前的日期, 时间 assume cs:code code segment main: out 70h,al ;告诉CMOS RAM将要 ...

  10. jsonp案例

    <button id="btn">click</button><script type="text/javascript"> ...