51nod 1237 最大公约数之和 V3(杜教筛)
【题目链接】
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1237
【题目大意】
求[1,n][1,n]最大公约数之和
【题解】
枚举最大公约数k,得到答案为2*∑(k*phi_sum(n/k))-n*(n+1)/2
phi_sum可以利用杜教筛实现
【代码】
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long LL;
const int mod=1333331,inv2=500000004;
const LL MOD=1e9+7;
LL a,b,n,miu[5000010],phi[5000010];
int p[500010],cnt=0,i,tot;
bool v[5000010];
struct HASHMAP{
int h[mod+10],cnt,nxt[100010];
LL st[100010],S[100010];
void push(LL k,LL v){
int key=k%mod;
for(int i=h[key];i;i=nxt[i]){
if(S[i]==k)return;
}++cnt;nxt[cnt]=h[key];h[key]=cnt;
S[cnt]=k;st[cnt]=v;
}
LL ask(LL k){
int key=k%mod;
for(int i=h[key];i;i=nxt[i]){
if(S[i]==k)return st[i];
}return -1;
}
}H;
void Get_Prime(){
for(miu[1]=phi[1]=1,i=2;i<=5000000;i++){
if(!v[i])p[tot++]=i,miu[i]=-1,phi[i]=i-1;
for(int j=0;i*p[j]<=5000000&&j<tot;j++){
v[i*p[j]]=1;
if(i%p[j]){
miu[i*p[j]]=-miu[i];
phi[i*p[j]]=phi[i]*(p[j]-1);
}else{
miu[i*p[j]]=0;
phi[i*p[j]]=phi[i]*p[j];
break;
}
}
}for(int i=2;i<=5000000;++i)phi[i]=(phi[i-1]+phi[i])%MOD;
}
LL phi_sum(LL n){
if(n<=5000000)return phi[n];
LL tmp=H.ask(n),la,A=0;
if(tmp!=-1)return tmp;
for(LL i=2;i<=n;i=la+1){
LL now=n/i; la=n/now;
(A+=(la-i+1)%MOD*phi_sum(n/i)%MOD)%=MOD;
}A=((n%MOD)*(n%MOD+1)%MOD*inv2%MOD-A+MOD)%MOD;
H.push(n,A);return A;
}
int main(){
scanf("%lld",&n);
Get_Prime();
LL la,ans=0;
for(LL i=1;i<=n;i=la+1){
LL now=n/i;
la=n/now;
ans=(ans+(i+la)%MOD*(la-i+1)%MOD*inv2%MOD*phi_sum(now)%MOD)%MOD;
}ans=ans*2%MOD; LL k=n%MOD;
ans=(ans-k*(k+1)%MOD*inv2%MOD+MOD)%MOD;
printf("%lld\n",ans);
return 0;
}
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 237 最大公约数之和 V3 杜教筛
Code: #include <bits/stdc++.h> #include <tr1/unordered_map> #define setIO(s) freopen(s&q ...
- 【51nod】1238 最小公倍数之和 V3 杜教筛
[题意]给定n,求Σi=1~nΣj=1~n lcm(i,j),n<=10^10. [算法]杜教筛 [题解]就因为写了这个非常规写法,我折腾了3天…… $$ans=\sum_{i=1}^{n}\s ...
- 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 1237 最大公约数之和 V3
求∑1<=i<=n∑1<=j<=ngcd(i,j) % P P = 10^9 + 7 2 <= n <= 10^10 这道题,明显就是杜教筛 推一下公式: 利用∑d ...
- 51nod 1244 莫比乌斯函数之和 【杜教筛】
51nod 1244 莫比乌斯函数之和 莫比乌斯函数,由德国数学家和天文学家莫比乌斯提出.梅滕斯(Mertens)首先使用μ(n)(miu(n))作为莫比乌斯函数的记号.具体定义如下: 如果一个数包含 ...
- 51nod 1244 莫比乌斯函数之和(杜教筛)
[题目链接] http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 [题目大意] 计算莫比乌斯函数的区段和 [题解] 利 ...
- [51Nod1238]最小公倍数之和 V3[杜教筛]
题意 给定 \(n\) ,求 \(\sum_{i=1}^n \sum_{j=1}^n lcm(i,j)\). \(n\leq 10^{10}\) 分析 推式子 \[\begin{aligned} an ...
随机推荐
- QF——iOS中数据持久化的几种方式
数据持久化的几种方式: 一.属性列表文件: .plist文件是种XML文件.数组,字典都可以和它互相转换.数组和字典可以写入本地变成plist文件.也可以读取本地plist文件,生成数组或字典. 读取 ...
- Android 多状态按钮 ToggleButton
ToggleButton 选中状态,未选中状态并且需要为不同的状态设置不同的显示文本. 属性: checked="true" ...
- Linux网络管理——linux网络配置
2. linux网络配置 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB&quo ...
- jq方法
DOM属性-获取和设置页面元素的DOM属性 .addClass()..attr()..prop()..hasClass()..html()..removeAttr()..removeClass().. ...
- 【JQ成长笔记】jQuery cookie的使用
jquery cookie挺好用的.简单实在.菜鸟都能用得上..额.文笔不好不好..咳咳.. 先来看看jq.cookie的aip 写入cookie $.cookie("this-cookie ...
- HTML中的uniqueID
Web页面上元素的name属性本身是可以重复的,理论上讲id是不可以重复的,但是现在的浏览器对重复的id都是默许的,可能有时候页面是需要一个唯一编号的.IE浏览器为页面上的所有元素都是提供了一个唯一名 ...
- Why Study JavaScript?
JavaScript is one of the 3 languages all web developers must learn: 1. HTML to define the content of ...
- skynet初学
记录下命令 git clone https://github.com/cloudwu/skynet.git sudo apt-get install autoconf sudo apt-get ins ...
- html5test
html5test Github https://github.com/NielsLeenheer/html5test 主程序是 scripts/7/engine.js 目前看到的分类大部分是基于判断 ...
- c# 多显示器设置主屏幕(Set primary screen for multiple monitors)
原文 http://www.cnblogs.com/coolkiss/archive/2013/09/18/3328854.html 经过google加各种百度,终于找到了一个有效的解决方案,下面是两 ...