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


  

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. Win7下 httpRequest带证书请求https网站

    常规情况下创建Web请求,并获取请求数据的代码如下: WebRequest req = WebRequest.Create(url); req.Timeout = 15000; WebResponse ...

  2. Knockout.Js官网学习(text绑定)

    前言 text 绑定到DOM元素上,使得该元素显示的文本值为你绑定的参数.该绑定在显示<span>或者<em>上非常有用,但是你可以用在任何元素上. 简单绑定 Today's ...

  3. luigi学习1

    一.luigi介绍 luigi是基于python语言的,可帮助建立复杂流式批处理任务管理系统.这些批处理作业典型的有hadoop job,数据库数据的导入与导出,或者是机器学习算法等等. luigi的 ...

  4. Lua 的函数库 01

    这里只介绍和插件编写比较有关的几个函数. 详细的Lua手册请参照Lua Reference Manual 5.1. table函数库 一部分的table函数只对其数组部分产生影响, 而另一部分则对整个 ...

  5. (转)Android L Ripple的使用

    声明:Demo并不是有本人所写,本人只是总结在这里 工程源码: RippleDemo.zip ---------------------------------------------------- ...

  6. smarty第一天

    1.安装 安装Smarty发行版在/libs/目录里的库文件(就是解压了). 2.工作原理 美工人员 1. 写模板, HTML CSS JavaScript 2. 使用Smarty表现逻辑 放变量, ...

  7. SQL Server 基础之《学生表-教师表-课程表-选课表》

    一.数据库表结构及数据 建表 CREATE TABLE Student ( S# INT, Sname ), Sage INT, Ssex ) ) CREATE TABLE Course ( C# I ...

  8. 利用Newtonsoft.Json实现Json序列化与反序列化

    在项目中用到了Newtonsoft.Json来实现序列化和反序列化,在这里写下实现代码. 1.创建类用于排除不序列化的属性 public class ExcludePropertiesContract ...

  9. mysql 1093 错误

    1093错误: 要更新某表,同时该表有字段值又来自该表的查询语句. 例如: INSERT INTO m_bulletincategory ( OrganizationKey , CategoryNam ...

  10. STM32F4_USART配置及细节描述

    Ⅰ.概述 关于USART串口通信,可以说是MCU的标配.不管是在实际项目应用中,还是在开发过程中,它都起着很重要的作用. 在项目应用中我们常常使用UART串口进行通信,根据通信的距离及稳定性,还选择添 ...