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 <= ...
随机推荐
- wamp apache 的虚拟机配置 多域名访问 的 三部曲
wamp apache 的虚拟机配置 多域名访问 的 三部曲 wamp: 1:C:\WINDOWS\system32\drivers\etc->hosts 加入自己的 ...
- mmzb游戏事故分析
最近一次线上更新,老项目挂了,遍地哀嚎,日活跃掉了好多,心痛... 这次维护时,SA为了缩减硬件资源,做了一次数据库迁移.给到开发手上的player db,只有一些索引数据,不带有任一玩家数据.玩家上 ...
- .NET涉及的一些名词
本文在最为概略的层次上对.NET涉及的一些名词进行解释, 包括: 通用语言基础架构(Common Language Infrastructure, CLI). 虚拟执行系统(Virtual Execu ...
- python基础(1)
一.应用 python应用:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算. 使用python的企业:YouTube.dropbox.BT.Quora.豆瓣.知乎.google.Yahoo ...
- Surprise团队第二周项目总结
Surprise团队第二周项目总结 项目进展 已实现五子棋人人模式部分 人人模式: 基本方式:采取黑棋先行,黑白交替的下棋顺序. 模式:通过鼠标点击相应棋盘中的"交叉点",在lay ...
- 【引】objective-c,5:Associated Objects 的原理
参考博客: http://blog.leichunfeng.com/blog/2015/06/26/objective-c-associated-objects-implementation-prin ...
- LeetCode() Binary Tree Level Order Traversal
感觉我这个思路好 先记录上一层有几个节点 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeN ...
- js 测试
今天js测试题目: 被基础题目虐暴......惨不忍睹 1. var num = 2; switch(num){ case 1: console.log("1"); case 2: ...
- 编程:使用递归方式判断某个字串是否回文(Palindrome)
Answer: import java.util.Scanner; public class Palindrome { private static int len;//全局变量整型数据 privat ...
- pyside 为窗口添加图片
有时我们需要添加一些图片到窗口上,下面给一个通过QLable实现的方法. 这里需要注意的是,当你启用多线程时,方法调用的setPixmap,会导致qt报出一个线程安全错误. 因此,让这个绘图工作尽量在 ...