欧拉函数/狄利克雷卷积/积性函数


  

2705: [SDOI2012]Longge的问题

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 1275  Solved: 820
[Submit][Status][Discuss]

Description

Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题。现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N)。

Input

一个整数,为N。

Output

一个整数,为所求的答案。

Sample Input

6

Sample Output

15

HINT

【数据范围】

对于60%的数据,0<N<=2^16。

对于100%的数据,0<N<=2^32。

Source

[Submit][Status][Discuss]

  掉到莫比乌斯反演的坑里无法自拔,问了zyf&在网上看了题解才做出来TAT……我果然好弱

  这个题是要求$\sum_{x=1}^{n}gcd(x,n)$,考虑它的实际意义,我们可以得到$ans=\sum_{i|n}i*\varphi(\frac{n}{i})$

  但是明显φ函数我们是没法预处理的……($\frac{n}{i}$这玩意太大了),但考虑到n的约数不会太多,所以我们可以边找因数边计算φ。

 /**************************************************************
Problem: 2705
User: Tunix
Language: C++
Result: Accepted
Time:16 ms
Memory:804 kb
****************************************************************/ //BZOJ 2705
#include<cmath>
#include<cstdio>
#define F(i,j,n) for(int i=j;i<=n;i++)
typedef long long LL;
LL phi(LL n){
int ret=,i;
for(int i=;i*i<=n;i++){
if (n%i==){
n/=i; ret*=i-;
while(n%i==) n/=i,ret*=i;
}
}
if (n>) ret*=n-;
return ret;
}
int main(){
int n;
scanf("%d",&n);
long long ans=;
for(int i=;i*i<=n;i++)
if(n%i==){
ans+=(LL)i*phi(n/i);
if (i*i<n) ans+=(LL)n/i*phi(i);
}
printf("%lld\n",ans);
return ;
}

  但是其实对于这个函数$\sum_{i|n} i*\varphi(\frac{n}{i})$是满足积性的,因为它就是$id(x)=x$和$\varphi(x)$这两个函数的狄利克雷卷积,那么……(贴个网上的图片)

 /**************************************************************
Problem: 2705
User: Tunix
Language: C++
Result: Accepted
Time:8 ms
Memory:816 kb
****************************************************************/ //BZOJ 2705
#include<cmath>
#include<cstdio>
#define F(i,j,n) for(int i=j;i<=n;i++)
int main(){
int n;
scanf("%d",&n);
long long ans=n;
F(i,,sqrt(n)){
if(n%i==){
int k=;
for(k;n%i==;k++,n/=i);
ans+=ans*(i-)*k/i;
}
}
if (n!=) ans+=ans*(n-)*/n;
printf("%lld\n",ans);
return ;
}

(诡异的加法版本)

P.S.但是这个【乘起来】的过程我在网上没找到啊……写法好诡异我理解不了……所以我机(sha)智(bi)地改了一个利用快速幂的版本= =耗时居然一样……如果有哪位路过的大牛搞明白了前面那个加法版本的意思的话请留言教我一下,万分感谢。

 /**************************************************************
Problem: 2705
User: Tunix
Language: C++
Result: Accepted
Time:8 ms
Memory:816 kb
****************************************************************/ //BZOJ 2705
#include<cmath>
#include<cstdio>
#define F(i,j,n) for(int i=j;i<=n;i++)
typedef long long LL;
LL Pow(LL a,LL b){
LL r=;
for(;b;b>>=,a*=a)if(b&)r*=a;
return r;
}
int main(){
int n;
scanf("%d",&n);
LL ans=;
F(i,,sqrt(n)){
if(n%i==){
int k=;
for(k;n%i==;k++,n/=i);
ans*=(k+)*Pow(i,k)-k*Pow(i,k-);
// ans+=ans*(i-1)*k/i;
}
}
if (n!=) ans*=*Pow(n,)-;
printf("%lld\n",ans);
return ;
}

(乘法版本)

【BZOJ】【2705】【SDOI2012】Longge的问题的更多相关文章

  1. BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2553  Solved: 1565[Submit][ ...

  2. BZOJ 2705: [SDOI2012]Longge的问题

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 2554  Solved: 1566[Submit][ ...

  3. BZOJ 2705: [SDOI2012]Longge的问题 GCD

    2705: [SDOI2012]Longge的问题 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnl ...

  4. bzoj 2705: [SDOI2012]Longge的问题 歐拉函數

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1035  Solved: 669[Submit][S ...

  5. Bzoj 2705: [SDOI2012]Longge的问题 欧拉函数,数论

    2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1959  Solved: 1229[Submit][ ...

  6. BZOJ 2705: [SDOI2012]Longge的问题( 数论 )

    T了一版....是因为我找质因数的姿势不对... 考虑n的每个因数对答案的贡献. 答案就是 ∑ d * phi(n / d) (d | n) 直接枚举n的因数然后求phi就行了. 但是我们可以做的更好 ...

  7. [bzoj]2705: [SDOI2012]Longge的问题[数论][数学][欧拉函数][gcd]

    [bzoj]P2705 OR [luogu]P2303 Longge的问题 Description Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数N,你需 ...

  8. bzoj 2705: [SDOI2012]Longge的问题——欧拉定理

    Description Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N). Input 一 ...

  9. BZOJ 2705 [SDOI2012]Longge的问题(欧拉函数)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2705 [题目大意] 求出∑gcd(i,N)(1<=i<=N) [题解] $ ...

  10. [bzoj 2705][SDOI2012]Longge的问题(数学)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2705 分析: 设k为n的因数 设f[k]为gcd(x,n)==k的x的个数,容易知道a ...

随机推荐

  1. 记 移动端页面中莫名其妙的渲染BUG

    问题描述: 在一个很简单的测试页面中 简单的两块布局,上下两块均没有单独设置字体大小,都用body继承的大小,即40px.我们现在给第一个块.fl  加上浮动 float:left; 另外一个块处于正 ...

  2. decode行转列,case when,

    1.行转列 转之前:

  3. (转)Android如何编程设置APP安装位置(外部存储或内部存储)?

    Beginning with API Level 8, you can allow your application to be installed on the external storage ( ...

  4. JDBC基础二

    1.配置文件:dbinfo.properties driverClass=com.mysql.jdbc.Driver url=jdbc:mysql://127.0.0.1:3306/test user ...

  5. Oracle 11gR2 RAC修改SCAN IP

    一.查看当前环境: # grid用户 检查scan-ip地址的配置 [grid@node1 ~]$ srvctl config scan SCAN name: scan-cluster.com, Ne ...

  6. rails devise使用

    gem 'devise'rails g devise:install Userrails g devise Userrails g devise:views

  7. Ruby判断文件是否存在

    flag = FileTest::exist?("LochNessMonster") flag = FileTest::exists?("UFO") # exi ...

  8. LaTeX中无法显示中文问题

  9. 刀哥多线程现操作gcd-10-delay

    延迟操作 // MARK: - 延迟执行 - (void)delay { /** 从现在开始,经过多少纳秒,由"队列"调度异步执行 block 中的代码 参数 1. when 从现 ...

  10. ref和out的区别

    ref类型参数是按地址传递,能改变原来的数值.使用ref传参前,变量必须赋值. 带有ref类型参数的函数,不会清空变量,所以离开该函数的时候,所有ref引用的变量可以赋值也可以不赋值. out类型参数 ...