bzoj3944

题目描述

输入

一共T+1行
第1行为数据组数T(T<=10)
第2~T+1行每行一个非负整数N,代表一组询问

输出

一共T行,每行两个用空格分隔的数ans1,ans2

样例输入

6
1
2
8
13
30
2333

样例输出

1 1
2 0
22 -2
58 -3
278 -3
1655470 2

bzoj4805

同上,不需要求mu


题解

杜教筛

公式推导:

这里有一个难点(其实也不能算难),就是由枚举d|i到枚举j≤⌊n/i⌋。此时可以看作下面语句的i是上面语句的i/d,而下面语句的j就是上面语句的d。这样枚举的话,不会出现重复或遗漏,不会超过n,并且便于计算。

推出这个式子之后,枚举⌊n/i⌋的取值(最多只有√n种),用记忆化搜索的方法记录每次的sum(⌊n/i⌋),并累计到sum(n)中。这里需要使用map。

这样做的时间复杂度是O(n3/4logn),如果预处理出n2/3以内的phi值,就能使时间复杂度达到更小的O(n2/3logn)。

这样就解决了bzoj4805。对于bzoj3944还需要求莫比乌斯函数的前缀和,方法和欧拉函数非常类似,运用到了∑mu(d)(d|n)=1的性质,只需要把n(n+1)/2换成1即可。

bzoj3944:

#include <cstdio>
#include <map>
#include <utility>
#define N 3000010
using namespace std;
typedef long long ll;
map<ll , pair<ll , ll> > f;
map<ll , pair<ll , ll> >::iterator it;
ll phi[N] , mu[N] , prime[N] , tot , sumphi[N] , summu[N] , m = 3000000;
bool np[N];
void query(ll n , ll &ans1 , ll &ans2)
{
if(n <= m)
{
ans1 = sumphi[n] , ans2 = summu[n];
return;
}
it = f.find(n);
if(it != f.end())
{
ans1 = it->second.first , ans2 = it->second.second;
return;
}
ans1 = n * (n + 1) / 2 , ans2 = 1;
ll i , last , tmp1 , tmp2;
for(i = 2 ; i <= n ; i = last + 1)
{
last = n / (n / i) , query(n / i , tmp1 , tmp2);
ans1 -= (last - i + 1) * tmp1 , ans2 -= (last - i + 1) * tmp2;
}
f[n] = make_pair(ans1 , ans2);
}
int main()
{
int T;
ll n , i , j , ans1 , ans2;
np[1] = 1 , mu[1] = phi[1] = sumphi[1] = summu[1] = 1;
for(i = 2 ; i <= m ; i ++ )
{
if(!np[i]) prime[++tot] = i , phi[i] = i - 1 , mu[i] = -1;
for(j = 1 ; j <= tot && i * prime[j] <= m ; j ++ )
{
np[i * prime[j]] = 1;
if(i % prime[j] == 0)
{
phi[i * prime[j]] = phi[i] * prime[j] , mu[i * prime[j]] = 0;
break;
}
else phi[i * prime[j]] = phi[i] * (prime[j] - 1) , mu[i * prime[j]] = -mu[i];
}
sumphi[i] = sumphi[i - 1] + phi[i] , summu[i] = summu[i - 1] + mu[i];
}
scanf("%d" , &T);
while(T -- ) scanf("%lld" , &n) , query(n , ans1 , ans2) , printf("%lld %lld\n" , ans1 , ans2);
return 0;
}

bzoj4805:

#include <cstdio>
#include <map>
#define N 1600010
using namespace std;
typedef long long ll;
map<ll , ll> f;
map<ll , ll>::iterator it;
ll m = 1600000 , phi[N] , prime[N] , tot , sum[N];
bool np[N];
ll query(ll n)
{
if(n <= m) return sum[n];
it = f.find(n);
if(it != f.end()) return it->second;
ll ans = n * (n + 1) / 2 , i , last;
for(i = 2 ; i <= n ; i = last + 1) last = n / (n / i) , ans -= (last - i + 1) * query(n / i);
f[n] = ans;
return ans;
}
int main()
{
ll i , j , n;
phi[1] = sum[1] = 1;
for(i = 2 ; i <= m ; i ++ )
{
if(!np[i]) phi[i] = i - 1 , prime[++tot] = i;
for(j = 1 ; j <= tot && i * prime[j] <= m ; j ++ )
{
np[i * prime[j]] = 1;
if(i % prime[j] == 0)
{
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
sum[i] = sum[i - 1] + phi[i];
}
scanf("%lld" , &n);
printf("%lld\n" , query(n));
return 0;
}

【bzoj3944/bzoj4805】Sum/欧拉函数求和 杜教筛的更多相关文章

  1. 【BZOJ3944/4805】Sum/欧拉函数求和 杜教筛

    [BZOJ3944]Sum Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用 ...

  2. BZOJ4805: 欧拉函数求和(杜教筛)

    4805: 欧拉函数求和 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 614  Solved: 342[Submit][Status][Discus ...

  3. BZOJ 4805: 欧拉函数求和 杜教筛

    https://www.lydsy.com/JudgeOnline/problem.php?id=4805 给出一个数字N,求sigma(phi(i)),1<=i<=N https://b ...

  4. LOJ6686 Stupid GCD(数论,欧拉函数,杜教筛)

    做题重心转移到 LOJ 了. 至于为什么,如果你知道“……”的密码,就去看吧. LOJ 上用户自创题大多数都不可做,今天看到个可做题(而且还是个水题),就来做了一发. 明显枚举立方根.(以下令 $m= ...

  5. 51 NOD 1239 欧拉函数之和(杜教筛)

    1239 欧拉函数之和 基准时间限制:3 秒 空间限制:131072 KB 分值: 320 难度:7级算法题 收藏 关注 对正整数n,欧拉函数是小于或等于n的数中与n互质的数的数目.此函数以其首名研究 ...

  6. 【51nod】1239 欧拉函数之和 杜教筛

    [题意]给定n,求Σφ(i),n<=10^10. [算法]杜教筛 [题解] 定义$s(n)=\sum_{i=1}^{n}\varphi(i)$ 杜教筛$\sum_{i=1}^{n}(\varph ...

  7. 51nod1244 欧拉函数之和 杜教筛

    和上一题差不多,一个是μ*I=e,一个是φ*I=Id 稍改就得到了这题的代码 (我会告诉你我一开始逆元算错了吗) #include <bits/stdc++.h> #define MAX ...

  8. 【BZOJ4805】欧拉函数求和(杜教筛)

    [BZOJ4805]欧拉函数求和(杜教筛) 题面 BZOJ 题解 好久没写过了 正好看见了顺手切一下 令\[S(n)=\sum_{i=1}^n\varphi(i)\] 设存在的某个积性函数\(g(x) ...

  9. 【BZOJ4805】欧拉函数求和

    题面 Description 给出一个数字N,求\(\sum\limits_{i=1}^n\varphi(i)\)i,1<=i<=N Input 正整数N.N<=2*10^9 Out ...

随机推荐

  1. PAT (Basic Level) Practise (中文)- 1005. 继续(3n+1)猜想 (25)

    http://www.patest.cn/contests/pat-b-practise/1005 卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证 ...

  2. Activiti学习记录(四)

    1 连线 注意:如果将流程图放置在和java类相同的路径,需要配置: 1.1 部署流程定义+启动流程实例 ProcessEngine processEngine = ProcessEngines.ge ...

  3. quartz调度

    http://www.cnblogs.com/lzrabbit/archive/2012/04/14/2446942.html

  4. zabbix监控系统时间的问题

    分类: 监控 2013-03-19 21:40:11   发现zabbix监控系统时间的一个问题!zabbix监控系统时间用的key是system.localtime,返回当前的系统时间,而配置tig ...

  5. display :inline-block 处理点小障碍

    使用inline-block之前先处理点小障碍:inline-block元素会有4px左右的空隙,这个是因为我们写代码时候的换行符所致. 解决办法很简单:在inline-block的父元素中设置样式f ...

  6. 一个简单的linux下设置定时执行shell脚本的示例

    很多时候我们有希望服务器定时去运行一个脚本来触发一个操作,比如说定时去备份服务器数据.数据库数据等 不适合人工经常做的一些操作这里简单说下 shell Shell俗称壳,类似于DOS下的command ...

  7. relu函数为分段线性函数,为什么会增加非线性元素

    relu函数为分段线性函数,为什么会增加非线性元素 我们知道激活函数的作用就是为了为神经网络增加非线性因素,使其可以拟合任意的函数.那么relu在大于的时候就是线性函数,如果我们的输出值一直是在大于0 ...

  8. Oracle两种临时表的创建与使用详解

    ORACLE数据库除了可以保存永久表外,还可以建立临时表temporary tables.这些临时表用来保存一个会话SESSION的数据,或者保存在一个事务中需要的数据.当会话退出或者用户提交comm ...

  9. CRM第一篇:权限组件之权限控制

    一.权限组件(1):一级菜单 二.权限组件(2):二级菜单 三.权限组件(3):默认选中非菜单(二级菜单) 四.权限组件(4):给动态菜单增加面包屑导航 五.权限组件(5):权限粒度控制到按钮 六.权 ...

  10. poj 2139 奶牛拍电影问题 floyd算法

    题意:奶牛拍一系列电影,n头牛拍m部电影,同一部电影种的搭档们距离为1,求最小距离? 思路:Floyd 图 最短路径 存图: 初始化图 for (int i = 0; i <= n; i++) ...