51 nod 1188 最大公约数之和 V2(狄利克雷卷积+线性筛法)

原创 2017年06月22日 19:03:38

题目大意:

给出T组n,
i<ni=1nj=i+gcd(i,j)
1<=n<=5000000,1<=T<=50000

吹水:

51 nod没良心,本来O(n log n)可以过的,可是不知为什么现在跑得这么慢,我把老曹的标再交了一次也T了3个点,于是强行推了O(n)的做法。

方法一:

先转换为:
ji=1i1j=1gcd(i,j)
=ji=1ij=1gcd(i,j)ni=1gcd(i,i)

ji=1ij=1gcd(i,j)
=ni=1φ(i)n/i(n/i+1)/2

线筛出φ,然后分块。

时间复杂度:
O(T n)

T了#17 - 25.

方法二:

f(i)=i1j=1gcd(i,j)
如果我们能够快速求出f(i),求一个前缀和,就可以O(1)求解。

我们可以想到枚举gcd.

伪代码:

i = 1 to n 
j = 2 to n / i
f(i * j) += φ(j) * i

时间复杂度:O(n log n)

方法三:

其实f(i)可以直接线筛:
f(i)=i1j=1gcd(i,j)
先看作:
ij=1gcd(i,j)
之后再减回去。
=d|idφ(i/d)
这显然就是个狄利克雷卷积,所以f(i)是一个积性函数。
接着我们考虑i=p^q的时候怎么求f(pq)
f(pq)
=qk=0pkφ(pqk)
=(q1k=0pk(pqkpqk1))+pq
=(q1k=0pqpq1)+pq
=q(pqpq1)+pq
所以在线筛的时候还需要记录最小质因子的指数和最小质因子的幂。

方法三Code:

#include<cstdio>
#define N 5000000
#define fo(i, x, y) for(int i = x; i <= y; i ++)
using namespace std;
long long f[N + 5];
int n, T, x[N + 5], y[N + 5], p[348514];
bool bz[N + 5];
int main() {
    f[1] = 1;
    fo(i, 2, N) {
        if(!bz[i]) p[++ p[0]] = i, x[i] = 1, y[i] = i, f[i] = 2 * i - 1;
        fo(j, 1, p[0]) {
            int k = i * p[j]; if(k > N) break;
            bz[k] = 1;
            if(!(i % p[j])) {
                x[k] = x[i] + 1;
                y[k] = y[i] * p[j];
                f[k] = f[k / y[k]] * (x[k] * (y[k] - y[k] / p[j]) + y[k]);
                break;
            }
            x[k] = 1;
            y[k] = p[j];
            f[k] = f[i] * f[p[j]];
        }
    }
    fo(i, 1, N) f[i] = f[i - 1] + f[i] - i;
    for(scanf("%d", &T); T; T --)
        scanf("%d", &n), printf("%lld\n", f[n]);
}

方法2Code:

#include<cstdio>
#define fo(i, x, y) for(int i = x; i <= y; i ++)
using namespace std;

const int Maxn = 5000000;
long long ans[Maxn + 5];
int n, T, p[400000], phi[Maxn + 5];
bool bz[Maxn + 5];

int main() {
    phi[1] = 1;
    fo(i, 2, Maxn) {
        if(!bz[i]) p[++ p[0]] = i, phi[i] = i - 1;
        fo(j, 1, p[0]) {
            int k = i * p[j]; if(k > Maxn) break;
            bz[k] = 1;
            if(!(i % p[j])) {
                phi[k] = phi[i] * p[j];
                break;
            }
            phi[k] = phi[i] * (p[j] - 1);
        }
    }
    fo(i, 1, Maxn) fo(j, 2, Maxn / i) ans[i * j] += i * phi[j];
    fo(i, 2, Maxn) ans[i] = ans[i - 1] + ans[i];
    printf("%d\n", ans[9]);
    for(scanf("%d", &T); T; T --)
        scanf("%d", &n), printf("%lld\n", ans[n]);
}

方法1Code:

#include<cmath>
#include<cstdio>
#define ll long long
#define fo(i, x, y) for(int i = x; i <= y; i ++)
using namespace std;

const ll Maxn = 5000000;
int n, T, p[400000];
ll phi[Maxn + 5];
bool bz[Maxn + 5];

int main() {
    phi[1] = 1;
    fo(i, 2, Maxn) {
        if(!bz[i]) p[++ p[0]] = i, phi[i] = i - 1;
        fo(j, 1, p[0]) {
            int k = i * p[j];
            if(k > Maxn) break;
            bz[k] = 1;
            if(i % p[j] == 0) {
                phi[k] = phi[i] * p[j];
                break;
            }
            phi[k] = phi[i] * (p[j] - 1);
        }
    }
    fo(i, 1, Maxn) phi[i] = phi[i - 1] + phi[i];
    for(scanf("%d", &T); T; T --) {
        ll ans = 0;
        scanf("%d", &n);
        fo(i, 1, n)  {
            int j = n / (n / i);
            ans += (phi[j] - phi[i - 1]) * (n / i) * (n / i + 1) / 2;
            i = j;
        }
        ans -= (ll) n * (n + 1) / 2;
        printf("%lld\n", ans);
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

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

数学 推导公式 欧拉筛法
  • qingshui23
  • qingshui23
  • 2016年08月10日 17:24
  • 865

狄利克雷卷积 【HDU5628】Clarke and math

题目大意: 给定f(1~n),求g(1~n)题目分析:(狄利克雷卷积) 狄利克雷卷积: 狄利克雷卷积满足:交换律,结合律,分配率等性质(和乘法是一样的)。我们设函数g(i)=1 如果k...
  • Todobe
  • Todobe
  • 2017年04月04日 13:54
  • 486

[2012集训队互测]JZPKIL - 生成函数,伯努利数,数论,莫比乌斯反演,狄利克雷卷积

一道要用到许多数论知识的题
  • whzzt
  • whzzt
  • 2017年03月10日 10:49
  • 781

狄利克雷过程

概率空间参见:http://en.wikipedia.org/wiki/Probability_space 定义:三部分组成(ΩFP)(\Omega F P) 1、样本空间Ω\Omega,所有可...
  • deltaququ
  • deltaququ
  • 2015年05月14日 22:01
  • 1629

狄利克雷过程理解

狄利克雷过程(dirichlet process )是目前变参数学习(non parameter)非常流行的一个理论,很多的工作都是基于这个理论来进行的,如HDP(hierarchical diric...
  • qq_27231343
  • qq_27231343
  • 2016年07月21日 11:43
  • 334

【bzoj4407】于神之怒加强版 莫比乌斯反演+狄利克雷卷积

Description给下N,M,K.求 Input输入有多组数据,输入数据的第一行两个正整数T,K,代表有T组数据,K的意义如上所示,下面第二行到第T+1行,每行为两个正整数N,M,其意义如上...
  • w_yqts
  • w_yqts
  • 2018年01月04日 14:21
  • 38

Mahout机器学习系列之-模糊c-均值聚类和狄利克雷过程聚类

模糊c-均值聚类(FCM)     ~~~~~模糊c-均值聚类算法 fuzzy c-means algorithm (FCMA)或称( FCM)。在众多模糊聚类算法中,模糊C-均值( FCM) 算法应...
  • qq_34531825
  • qq_34531825
  • 2016年10月15日 16:09
  • 1173

多元分布和狄利克雷分布

Multinomial distribution 将二元分布的二元情况扩展到多元,即可得到对应的多元分布。 首先先将伯努利分布扩展到多元假设对于离散变量xx,可能有KK个取值,那么xx一次...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年02月29日 20:47
  • 1194

狄利克雷条件

属于傅里叶级数分析使用的条件: 傅里叶在提出傅里叶级数时坚持认为,任何一个周期信号都可以展开成傅里叶级数,虽然这个结论在当时引起许多争议,但持异议者却不能给出有力的不同论据。直到20年后(1829年...
  • aihali
  • aihali
  • 2015年06月24日 09:35
  • 1102

狄利克雷过程(dirichlet process )和分布

狄利克雷过程(dirichlet process )是目前变参数学习(non parameter)非常流行的一个理论,很多的工作都是基于这个理论来进行的,如HDP(hierarchical diric...
  • chinaliping
  • chinaliping
  • 2013年07月03日 13:20
  • 2397
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:51 nod 1188 最大公约数之和 V2(狄利克雷卷积+线性筛法)
举报原因:
原因补充:

(最多只允许输入30个字)