bzoj 3944 Sum —— 杜教筛
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3944
杜教筛入门题!
看博客:https://www.cnblogs.com/zjp-shadow/p/8491542.html
写法模仿其他博客的,但很慢啊...
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
int const maxn=;
ll T,m,p[maxn],phi[maxn],mu[maxn],cnt,mx;
bool vis[maxn];
map<ll,ll>mp1,mp2;
ll rd()
{
ll ret=,f=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='')ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return ret*f;
}
void init()
{
int n=mx;
phi[]=; mu[]=;
for(int i=;i<=n;i++)
{
if(!vis[i])phi[i]=i-,p[++cnt]=i,mu[i]=-,vis[i]=;
for(int j=;j<=cnt&&i*p[j]<=n;j++)
{
vis[i*p[j]]=;
if(i%p[j]==)
{
phi[i*p[j]]=phi[i]*p[j]; mu[i*p[j]]=;
break;
}
phi[i*p[j]]=phi[i]*(p[j]-);
mu[i*p[j]]=-mu[i];
}
}
for(int i=;i<=n;i++)mu[i]+=mu[i-],phi[i]+=phi[i-];
}
void dfs(ll n,ll &ans1,ll &ans2)
{
if(n<mx){ans1=phi[n]; ans2=mu[n]; return;}
if(mp1.count(n)){ans1=mp1[n]; ans2=mp2[n]; return;}
ans1=(n+)*n/; ans2=;
for(ll i=,lst;i<=n;i=lst+)
{
lst=n/(n/i);// i ~ n/(n/i) 答案都相同
ll tmp1,tmp2; dfs(n/i,tmp1,tmp2);
ans1-=tmp1*(lst-i+);
ans2-=tmp2*(lst-i+);
}
mp1[n]=ans1; mp2[n]=ans2;
}
int main()
{
mx=;
init();
T=rd();
while(T--)
{
m=rd();
ll ans1,ans2; dfs(m,ans1,ans2);
printf("%lld %lld\n",ans1,ans2);
}
return ;
}
bzoj 3944 Sum —— 杜教筛的更多相关文章
- BZOJ 3944: Sum [杜教筛]
3944: Sum 贴模板 总结见学习笔记(现在还没写23333) #include <iostream> #include <cstdio> #include <cst ...
- 3944: Sum[杜教筛]
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3471 Solved: 946[Submit][Status][Discuss] ...
- [BZOJ3944]Sum(杜教筛)
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6201 Solved: 1606[Submit][Status][Discuss ...
- 洛谷P4213 Sum(杜教筛)
题目描述 给定一个正整数N(N\le2^{31}-1)N(N≤231−1) 求ans_1=\sum_{i=1}^n\phi(i),ans_2=\sum_{i=1}^n \mu(i)ans1=∑i=1 ...
- [bzoj3944] sum [杜教筛模板]
题面: 传送门 就是让你求$ \varphi\left(i\right) $以及$ \mu\left(i\right) $的前缀和 思路: 就是杜教筛的模板 我们把套路公式拿出来: $ g\left( ...
- bzoj3944: Sum 杜教筛板子题
板子题(卡常) 也可能是用map太慢了 /************************************************************** Problem: 3944 Us ...
- ●杜教筛入门(BZOJ 3944 Sum)
入门杜教筛啦. http://blog.csdn.net/skywalkert/article/details/50500009(好文!) 可以在$O(N^{\frac{2}{3}})或O(N^{\f ...
- bzoj 3944: Sum(杜教筛)
3944: Sum Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 4930 Solved: 1313[Submit][Status][Discuss ...
- bzoj 3944: Sum【莫比乌斯函数+欧拉函数+杜教筛】
一道杜教筛的板子题. 两个都是积性函数,所以做法是一样的.以mu为例,设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1} ...
随机推荐
- java虚拟机(五)--垃圾回收机制GC5
什么样的对象需要回收 如果对象已经死亡了,就可以进行回收,判断方式如下 1).引用计数器:给对象添加一个计数器,有地方引用,就+1,当引用失效,就-1.当计数器为0时,判断对象不能再使用,但是当对象相 ...
- 【原】thinkphp修改Redis操作类,支持选择数据库功能及添加其他方法
版本3.2.2(ThinkPHP\Library\Think\Cache\Driver\Redis.class.php), 一:官方默认不支持选择数据库功能及,现就可选择数据库功能进行说明. 1 co ...
- 【2018百度之星初赛(A)】1002 度度熊学队列
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=6375 Knowledge Point: STL - map:https://www.cnblogs.c ...
- <MyBatis>入门八 工作原理
1.获取sqlSessionFactory对象 首先拿到全局配置文件的流对象 创建SqlSessionFactoryBuilder对象,并调用build方法,把流传进去 build方法 创建一个XML ...
- zabbix登录密码重置方法
注:由于账号较多,难免忘记账号,下面是找回zabbix登录密码的过程. 一.登录zabbix数据库 [root@123 ~]# mysql -uroot -p密码 二.修改zabbix密码 mysql ...
- mysql批量替换某个字段的部分内容
举例说明 有数据表person,结构如下 id name urls 1 张三 xh.jpg 2 李四 xh.jpg 3 王五 3.jpg 需求:将urls字段中的xh替换为id字段的值 语句: UPD ...
- 利用postman进行接口测试并发送带cookie请求的方法
做web测试的基本上都用用到postman去做一些接口测试,比如测试接口的访问权限,对于某些接口用户A可以访问,用户B不能访问:比如有时需要读取文件的数据.在postman上要实现这样测试,我们就必要 ...
- [luoguP1072] Hankson 的趣味题(数论)
传送门 由题意得 gcd(x, a0) = a1 ——> gcd(x / a1, a0 / a1) = 1 lcm(x, b0) = b1 ——> x * b0 / gcd(x, b0) ...
- poj 3237 树链剖分模板(用到线段树lazy操作)
/* 本体在spoj375的基础上加了一些操作,用到线段树的lazy操作模板类型 */ #include<stdio.h> #include<string.h> #includ ...
- 【Tomcat】Tomcat替换猫的图片
参考:网页title上添加图片 直接替换Tomcat安装目录下ROOT下面的favicon.ico图标(名字与前面一样favicon.ico)