51nod1237 最大公约数之和

题目链接

题意

其实就是求

\[\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j)\]

思路

建议先看一下此题的一个弱化版

推一下式子

\[\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j)\]
\[= \sum\limits_{k=1}^nk\sum\limits_{i=1}^n\sum\limits_{j=1}^n[gcd(i,j)=k]\]

\[=\sum\limits_{k=1}^nk\sum\limits_{i=1}^{\frac{n}{k}}\sum\limits_{j=1}^{\frac{n}{k}}[gcd(i,j)=1]\]

\[=\sum\limits_{k=1}^nk\sum\limits_{i=1}^{\frac{n}{k}}2\varphi(i)-1\]

设\(\phi(i)=\varphi(1)+\varphi(2)+...+\varphi(i)\)

则原式
\[=\sum\limits_{i=1}^ni(2\phi(\frac{n}{i})-1)\]

然后就可以数论分块啦。

至于怎么比较快的求\(\phi(i)\),基本的杜教筛喽。。

代码

//loj6074
/*
* @Author: wxyww
* @Date:   2019-03-30 12:43:48
* @Last Modified time: 2019-03-30 19:43:10
*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<ctime>
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7,N = 1000000 + 100,inv2 = (mod + 1) / 2;

ll read() {
    ll x=0,f=1;char c=getchar();
    while(c<'0'||c>'9') {
        if(c=='-') f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9') {
        x=x*10+c-'0';
        c=getchar();
    }
    return x*f;
}
map<ll,ll>ma;
ll n,sum[N];
int dis[N],vis[N],js;
int dls(ll x) {
    if(x <= 1000000) return sum[x];
    if(ma[x]) return ma[x];
    ll ret = 1ll * x % mod * ((x + 1) % mod) % mod * inv2 % mod;
    for(ll l = 2,r;l <= x;l = r + 1) {
        r = x / (x / l);
        ret -= 1ll * (r - l + 1) % mod * dls(x / l) % mod;
        ret = (ret + mod) % mod;
    }
    return ma[x] = ret;
}
void pre() {
    sum[1] = 1;vis[1] = 1;
    int NN = min(n,1000000ll);
    for(int i = 2;i <= NN;++i) {
        if(!vis[i]) {
            dis[++js] = i;
            sum[i] = i - 1;
        }
        for(int j = 1;j <= js && dis[j] * i <= NN;++j) {
            vis[dis[j] * i] = 1;
            if(i % dis[j] == 0) {
                sum[dis[j] * i] = sum[i] * dis[j] % mod;    break;
            }
            sum[dis[j] * i] = (dis[j] - 1) * sum[i] % mod;
        }
        sum[i] += sum[i - 1];
        sum[i] %= mod;
    }

}
signed main() {
    n = read();
    pre();
    ll ans = 0;
    for(ll l = 1,r;l <= n;l = r + 1) {
        r = n / (n / l);
        ans = (ans + (1ll * (r - l + 1) % mod * ((r + l) % mod) % mod * inv2 % mod) % mod * ((2ll * dls(n / l) % mod) - 1 + mod) % mod) % mod;
    }
    cout<<ans;
    return 0;
}

原文地址:https://www.cnblogs.com/wxyww/p/51nod1237.html

时间: 2024-10-03 23:26:36

51nod1237 最大公约数之和的相关文章

51nod1237 最大公约数之和 V3

n<=1e10,问1<=i<=n,1<=j<=n,gcd(i,j)的和%1e9+7. QAQ自推的第一道,虽然很简单而且走了很多弯路而且推错了一次被ccz大爷调教,但还是挺感动的.. 其实在推数论之前可以先打个$\mu$和$\varphi $的表,推个两三步就验证一下,否则如果是大数论题,推错的后果是极其严重的. $\sum_{i=1}^{n}\sum_{j=1}^{n}(i,j)$ $=\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}[(

1040 最大公约数之和

1040 最大公约数之和 题目来源: rihkddd 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 给出一个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 <= 10^9) Output 公约数之和 Input示例 6 Output示例 15思路:欧拉函数:找n的约数,k为n的一个约数,设s,n的最大公约数为k,那么我们可以知道gcd(s/k,n/

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 <= 10^9) OutPut 公约数之和 Input示例 6 Output示例 15 AC代码: /** *@xiaoran *1 2 3 4 5 6 *1 2 3 2 1 6 *2个1,2个2,1个3,1个6,注意后面的值都是n的因子. *现在我们只需要计算出各个因子的个数就行了, *那么1的个数是与n互质的

最大公约数之和——极限版II

P1490 - [UVa11426 ]最大公约数之和--极限版II Description Input 输入包含至多100组数据.每组数据占一行,包含正整数N(2<=N<=1<N<4000000).输入以N=0结束. Output 对于每组数据,输出一行,即所对应的G值.答案保证在64位带符号整数范围内. Sample Input 10 100 200000 0 Sample Output 67 13015 143295493160 Hint 数据范围: 对于30%的数据,2<

51 nod 1188 最大公约数之和 V2

1188 最大公约数之和 V2 题目来源: UVA 基准时间限制:2 秒 空间限制:262144 KB 分值: 160 难度:6级算法题 给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和. 相当于计算这段程序(程序中的gcd(i,j)表示i与j的最大公约数): G=0; for(i=1;i<N;i++) for(j=i+1;j<=N;j++) { G+=gcd(i,j); } Input 第1行:1个数T,表示后面用作输入测试的数的数量.(1 <= T <= 5000

51Nod 1040 最大公约数之和

                                 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 <= 10^9) //实际上应该是n<=10^18 Output 公约数之和 Input示例 6 Output示例 15 欧拉函数 对于 样例 1 2 3 2 1 ----6 有2个1 2个2 和 1个3 两个1的情况

1188 最大公约数之和 V2

1188 最大公约数之和 V2 题目来源: UVA 基准时间限制:2 秒 空间限制:262144 KB 给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和. 相当于计算这段程序(程序中的gcd(i,j)表示i与j的最大公约数): G=0; for(i=1;i<N;i++) for(j=i+1;j<=N;j++) { G+=gcd(i,j); } Input 第1行:1个数T,表示后面用作输入测试的数的数量.(1 <= T <= 50000) 第2 - T + 1行:每行

51 NOD 1188 最大公约数之和 V2(基础数论)

传送门 给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和.计算这段程序 G=0; for(i=1; i < N;i++) for(j=i+1;j<=N;j++) { G+=gcd(i,j); } Input 第1行:1个数T,表示后面用作输入测试的数的数量.(1 <= T <= 50000) 第2 - T + 1行:每行一个数N.(2 <= N <= 5000000) Output 共T行,输出最大公约数之和. Input示例 3 10 100 20000

51Nod 最大公约数之和V1,V2,V3;最小公倍数之和V1,V2,V3

1040 最大公约数之和 给出一个n,求1-n这n个数,同n的最大公约数的和.比如:n = 6 1,2,3,4,5,6 同6的最大公约数分别为1,2,3,2,1,6,加在一起 = 15 输入 1个数N(N <= 10^9) 输出 公约数之和 输入样例 6 输出样例 15 题解 \[ \sum_{i=1}^n\gcd(i,n)=\sum_{d|n}d\varphi(n) \] 暴力搞就行了. 1188 最大公约数之和 V2 给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和. 相当于计