码迷,mamicode.com
首页 > 其他好文 > 详细

[洛谷1390]公约数的和

时间:2017-08-15 14:12:36      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:printf   bsp   style   状态   code   amp   lld   gcd   logs   

题目大意:

求$\displaystyle{\sum_{1\leq i<j\leq n}}gcd(i,j)$的值。

思路:

 

由于数据水,可以直接用动态规划做。
用$f_k$表示在n以内以$k$为$gcd$的整数对个数,那么可以得到状态转移方程:
$f_i=\lfloor\frac{n}{i}\rfloor-\displaystyle{\sum_{j=2}^{\lfloor\frac{n}{i}\rfloor}}f_{ij}$
因为要减去$gcd(d,d)=d$的和$gcd(i,j)=gcd(j,i)$重复的,答案为:
$\frac{\displaystyle{\sum_{i=1}^n}f_i-\frac{n\times n+1}{2}}{2}$

 1 #include<cstdio>
 2 const long long N=2000001;
 3 long long f[N]={0};
 4 inline long long sqr(const long long x) {
 5     return x*x;
 6 }
 7 int main() {
 8     long long n;
 9     scanf("%lld",&n);
10     long long ans=0;
11     for(long long i=n;i;i--) {
12         f[i]=sqr(n/i);
13         for(long long j=2;j<=n/i;j++) {
14             f[i]-=f[i*j];
15         }
16         ans+=f[i]*i;
17     }
18     printf("%lld\n",(ans-n*(n+1)/2)/2);
19     return 0;
20 }

 

[洛谷1390]公约数的和

标签:printf   bsp   style   状态   code   amp   lld   gcd   logs   

原文地址:http://www.cnblogs.com/skylee03/p/7364599.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!