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}[(i,j)=d]$

严重错误!d不见了。上面这个式子最后等于1.

$\sum_{i=1}^{n}\sum_{j=1}^{n}(i,j)$

$=\sum_{d=1}^{n}d\sum_{i=1}^{n}\sum_{j=1}^{n}[(i,j)=d]$

闪一句:反演!

$=\sum_{d=1}^{n}d\sum_{d|t,t\leqslant n}\mu(\frac{t}{d})(\left \lfloor \frac{n}{t} \right \rfloor)^2$

闪一句:这里尝试$t=kd$,结果失败了。正确操作是把t放前面……

$=\sum_{t=1}^{n}(\left \lfloor \frac{n}{t} \right \rfloor)^2\sum_{d|t}d\mu(\frac{t}{d})$

$=\sum_{t=1}^{n}(\left \lfloor \frac{n}{t} \right \rfloor)^2\varphi(t)$

漂亮!把欧拉函数丢去杜教筛即可。

 1 #include<string.h>
 2 #include<stdlib.h>
 3 #include<stdio.h>
 4 #include<math.h>
 5 //#include<assert.h>
 6 #include<algorithm>
 7 //#include<iostream>
 8 //#include<bitset>
 9 using namespace std;
10
11 #define LL long long
12 LL n,m;
13 const int mod=1e9+7;
14 #define maxn 5000011
15 int phi[maxn],sumphi[maxn],prime[maxn],lp; bool notprime[maxn];
16 void pre(int n)
17 {
18     phi[1]=1; sumphi[1]=1;
19     for (int i=2;i<=n;i++)
20     {
21         if (!notprime[i]) prime[++lp]=i,phi[i]=i-1;
22         sumphi[i]=sumphi[i-1]+phi[i];
23         sumphi[i]-=sumphi[i]>=mod?mod:0;
24         for (int j=1,tmp;j<=lp && 1ll*prime[j]*i<=n;j++)
25         {
26             notprime[tmp=prime[j]*i]=1;
27             if (i%prime[j]) phi[tmp]=phi[i]*(prime[j]-1);
28             else {phi[tmp]=phi[i]*prime[j]; break;}
29         }
30     }
31 }
32
33 struct Edge{LL to;int v,next;};
34 #define maxh 1000007
35 struct Hash
36 {
37     int first[maxh],le; Edge edge[maxn];
38     Hash() {le=2;}
39     void insert(LL y,int v) {int x=y%maxh; Edge &e=edge[le]; e.to=y; e.v=v; e.next=first[x]; first[x]=le++;}
40     int find(LL y) {int x=y%maxh; for (int i=first[x];i;i=edge[i].next) if (edge[i].to==y) return edge[i].v; return -1;}
41 }h;
42
43 int calc(LL n)
44 {
45     if (n<=m) return sumphi[n];
46     int tmp=h.find(n); if (tmp!=-1) return tmp;
47     LL ans=1ll*n%mod*((n+1)%mod)%mod*((mod+1)>>1)%mod;
48     for (LL i=2,last;i<=n;i=last+1)
49     {
50         last=n/(n/i);
51         ans-=((last-i+1)%mod)*1ll*calc(n/i)%mod;
52         ans+=ans<0?mod:0;
53     }
54     h.insert(n,ans);
55     return ans;
56 }
57
58 int main()
59 {
60     scanf("%lld",&n);
61     m=pow(n,2.0/3); pre(m);
62     LL ans=0;
63     for (LL i=1,last;i<=n;i=last+1)
64     {
65         last=n/(n/i);
66         ans+=(calc(last)-calc(i-1))*1ll*((n/i)%mod)%mod*((n/i)%mod)%mod;
67         ans+=ans<0?mod:0,ans-=ans>=mod?mod:0;
68     }
69     printf("%lld\n",ans);
70     return 0;
71 }

原文地址:https://www.cnblogs.com/Blue233333/p/8319021.html

时间: 2024-11-01 22:40:13

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

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\limit

【51Nod 1237】最大公约数之和 V3 莫比乌斯反演+杜教筛

题意 求$\sum_{i=1}^{n}\sum_{j=1}^{n}(i,j)$ 枚举约数 $$ \begin{align} ans &=\sum_{d=1}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}[(i,j)=d] \ &=\sum_{d=1}^{n}\sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{n}{d} \rfloor}[(i,j)=1] \ \end{align} $$ 利用

51Nod 1237 最大公约数之和 V3 杜教筛

题目链接http://www.51nod.com/Challenge/Problem.html#!#problemId=1237 题意:求$\sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j)$ ,$1\leq{n}\leq10^{10}$. 知识提要:$n=\sum_{d|n}\varphi(d)$ 该公式证明https://blog.csdn.net/chen1352/article/details/50695930 根据莫比乌斯反演可以得到 $\varphi(n)=\s

51NOD 1237 最大公约数之和 V3(杜教筛)

题意 求 $\sum_{i=1}^n \sum_{j=1}^n gcd(i,j)$. 分析 $$\begin{aligned}\sum_{i=1}^n \sum_{j=1}^n gcd(i,j)  &= \sum_{i=1}^n \sum_{j=1}^n d[gcd(i, j)=d] \\&= \sum_{d=1}^n d \sum_{i=1}^n \sum_{j=1}^n[gcd(i,j=d)] \\&= \sum_{d=1}^n d \sum_{i=1}^{\left \lfl

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的所有数,两两之间的最大公约数之和. 相当于计

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