51nod 1237 最大公约数之和 V3
求∑1<=i<=n∑1<=j<=ngcd(i,j) % P
P = 10^9 + 7
2 <= n <= 10^10
这道题,明显就是杜教筛
推一下公式:
利用∑d|nphi(d) = n
ans = ∑1<=i<=n∑1<=j<=n∑d|(i,j)phi(d)
= ∑1<=d<=n∑1<=i<=n∑1<=j<=n[d|(i,j)]phi(d)
= ∑1<=d<=nphi(d)∑1<=i<=n∑1<=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的更多相关文章
- 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 ...
- 51nod 1237 最大公约数之和 V3(杜教筛)
[题目链接] https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1237 [题目大意] 求[1,n][1,n]最大公约数之和 ...
- 51Nod.1237.最大公约数之和 V3(莫比乌斯反演 杜教筛 欧拉函数)
题目链接 \(Description\) \(n\leq 10^{10}\),求 \[\sum_{i=1}^n\sum_{j=1}^ngcd(i,j)\ mod\ (1e9+7)\] \(Soluti ...
- 51nod 1237 最大公约数之和 V3【欧拉函数||莫比乌斯反演+杜教筛】
用mu写lcm那道卡常卡成狗(然而最后也没卡过去,于是写一下gcd冷静一下 首先推一下式子 \[ \sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j) \] \[ \sum_{i= ...
- 51nod 237 最大公约数之和 V3 杜教筛
Code: #include <bits/stdc++.h> #include <tr1/unordered_map> #define setIO(s) freopen(s&q ...
- [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 ...
- 51nod 1040 最大公约数之和(欧拉函数)
1040 最大公约数之和 题目来源: rihkddd 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 给出一个n,求1-n这n个数,同n的最大公约数的和.比如: ...
- 51nod 1040 最大公约数之和 欧拉函数
1040 最大公约数之和 题目连接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 Description 给 ...
- 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 <= ...
随机推荐
- 使用SqlLocalDB命令行管理LocalDB
SqlLocalDB.exe start v11.0 SqlLocalDB.exe info v11.0 SQL Server Management Stdio添加管道连接实例 默认实例名(local ...
- 面试时被问到js的绑定事件,我居然不知道怎么回答。回来查了下,做个笔记
事件绑定是几种方法 以下为例: <button id='btn'>click me</button> function Btn(){ alert('click'); } 1.直 ...
- 杭电acm 1002 大数模板(一)
从杭电第一题开始A,发现做到1002就不会了,经过几天时间终于A出来了,顺便整理了一下关于大数的东西 其实这是刘汝佳老师在<算法竞赛 经典入门 第二版> 中所讲的模板,代码原封不动写上的, ...
- android中加载的html获取的宽高不正确
wap页面使用 js库是zepto,按照惯例在$(function(){})中,来获取当前可视区的宽高,但得到的宽高却与预想的相差十万八千里. 原本android手机的浏览器设定的宽高基本是360*6 ...
- Sqlserver 存储过程
转载自:http://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html Transact-SQL中的存储过程,非常类似于Java语言中的方法, ...
- NOIP2016报零记
其实,NOIP2016已经于10天之前就结束了,但是由于种种原因,没有写总结. 现在就来填上这个坑吧. DAY1: T1:一道简(kun)单(nan)的模拟,虽然ac,但是考试的时候总觉得怪怪的.并且 ...
- js的一点
1.js中实现继承的方法 1.js原型(prototype)实现继承 <SPAN style="<SPAN style="FONT-SIZE: 18px"&g ...
- JavaEE视频学习
1.实现东西应先实现静态,即使用固定的数据,比如链接数据库应先实现指定数据库如mysql的链接,成功后再向动态链接修改.方法也要这样写,一步步推进,不能一下子写出动态方法,这样很容易出错.
- About SQLite
About SQLite See Also... Features When to use SQLite Frequently Asked Questions Well-known Users Boo ...
- 关于是用dotnet获取本机IP地址+计算机名的方法
印象中在maxscript帮助文档里找到过方法,但是当时没记下来.只能通过dotnet实现了. 如果电脑有无线网卡和本地连接,可能会出现乱码,也问了写dotnet的朋友,提供了一些思路,不过最终还是使 ...