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 <= ...
随机推荐
- WebMidiLink
g200kg > WebMidiLink > 1.Introduction WebMidiLink 2012/06/26 1.Introduction « Prev 1.Introduct ...
- div 在页面上漂浮
<div id="codefans_net" style="position:absolute;z-index:5;"> <a& ...
- 【css】a标签的用法
<a>标签属性display的不同设置达到目的 display:block和display:inline; display:block 可以使得<a>标签设置宽高.边线.mar ...
- tomcat取带有中文的参数乱码的解决办法
1. 对于post参数,可以用filter来处理,在dofilter之前,加入以下代码: request.setCharacterEncoding("UTF-8"); 2. 对于g ...
- UE4 VR 模式全屏 4.13
以前写了一个4.11版本全屏,高版本的没用所以也不清楚情况,最近出了4.13,刚好新项目要用上打包出来以后发现,控制台命令fullscreen没有用了, 被stereo on 替代,但是还是没有全屏, ...
- git下载教程
1.git for windows的下载链接 1.*的版本 https://github.com/msysgit/msysgit/releases 2.*的版本 https://github. ...
- java 环境配置 及java 历史
知识点概括:1 Java 的历史 2 JDK 的配置 3 文件的编译与执行 ...
- 合并果子 2004年NOIP全国联赛普及组
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆 ...
- PHP文件和目录操作-----复制、移动、重命名、删除文件
PHP通过copy()函数来复制一个文件.用法如下: bool copy(string $source, string $dest) 其中$source是源文件的路径,$dest是目的文件的路径.函数 ...
- CSS初体验
经过学习,我对css有了初步的认识.css是层叠样式表(Cascading Style Sheets的缩写,它用于HTML元素的显示形式,是W3C推出的格式化的标准技术.CSS现在已经被大多数浏览器所 ...