本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

Description

Input

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

Output

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

Sample Input

6
1
2
8
13
30
2333

Sample Output

1 1
2 0
22 -2
58 -3
278 -3
1655470 2
 
 
正解:线性筛+杜教筛
解题报告:
  这道题是杜教筛模板题,在笔记本上推了两遍才开始写......
  

  显然后面那一坨可以记忆化搜索。

  另外因为无法用数组存下来(此时$\frac{n}{i}$大于等于$n^{\frac{2}{3}}$),所以我们考虑用分子(即$i$,显然小于等于$n^{\frac{1}{3}}$)表示这个分数所代表的欧拉函数前缀和,即可避开存不下的尴尬问题。  

  ps:我讨厌$2^{31}-1$!!!!!!!!看看我代码中的unsigned int就懂了。

  

//It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef unsigned int uint;
const int MAXN = 5400011;
const int m = 5400000;
const int MAXM = 100011;
int n,prime[MAXN],cnt;
LL mobius[MAXN],phi[MAXN];
LL ans_phi[MAXM],ans_mo[MAXM];
bool vis[MAXN],visp[MAXM],vism[MAXM];
inline int getint(){
int w=0,q=0; char c=getchar(); while((c<'0'||c>'9') && c!='-') c=getchar();
if(c=='-') q=1,c=getchar(); while (c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); return q?-w:w;
} inline void init(){
mobius[1]=1; phi[1]=1;
for(int i=2;i<=m;i++) {
if(!vis[i]) { prime[++cnt]=i; mobius[i]=-1; phi[i]=i-1; }
for(int j=1;j<=cnt && (LL)i*prime[j]<=m;j++) {
vis[i*prime[j]]=1;
if(i%prime[j]==0) { phi[i*prime[j]]=phi[i]*prime[j]; mobius[i*prime[j]]=0; break; }
else { phi[i*prime[j]]=phi[i]*phi[prime[j]]; mobius[i*prime[j]]=-mobius[i]; }
}
}
for(int i=2;i<=m;i++) mobius[i]+=mobius[i-1],phi[i]+=phi[i-1];
} inline LL get_phi(uint now){
if(now<=m) return phi[now];
int nn=n/now,nex; if(visp[nn]) return ans_phi[nn];
LL sav=(LL)now*(now+1)>>1;
for(uint i=2;i<=now;i=nex+1) {
nex=now/(now/i);
sav-=get_phi(now/i/*!!!*/)*(nex-i+1);
}
visp[nn]=1;
ans_phi[nn]=sav;
return sav;
} inline LL get_mo(uint now){
if(now<=m) return mobius[now];
int nn=n/now,nex; if(vism[nn]) return ans_mo[nn];
LL sav=1;
for(uint i=2;i<=now;i=nex+1) {
nex=now/(now/i);
sav-=get_mo(now/i/*!!!*/)*(nex-i+1);
}
vism[nn]=1;/*!!!*/
ans_mo[nn]=sav;
return sav;
} inline void work(){
int T=getint(); init();
while(T--) {
n=getint(); memset(visp,0,sizeof(visp)); memset(vism,0,sizeof(vism));
LL ans1=get_phi(n); LL ans2=get_mo(n);
printf("%lld %lld\n",ans1,ans2);
}
} int main()
{
work();
return 0;
}

  

 
 

BZOJ3944 Sum的更多相关文章

  1. BZOJ3944: Sum(杜教筛模板)

    BZOJ3944: Sum(杜教筛模板) 题面描述 传送门 题目分析 求\(\sum_{i=1}^{n}\mu(i)\)和\(\sum_{i=1}^{n}\varphi(i)\) 数据范围线性不可做. ...

  2. [BZOJ3944]Sum(杜教筛)

    3944: Sum Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6201  Solved: 1606[Submit][Status][Discuss ...

  3. BZOJ3944 Sum 数论 杜教筛

    原文链接http://www.cnblogs.com/zhouzhendong/p/8671759.html 题目传送门 - BZOJ3944 题意 多组数据(组数<=10). 每组数据一个正整 ...

  4. 杜教筛 && bzoj3944 Sum

    Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用空格分隔的数ans1,ans ...

  5. 杜教筛:Bzoj3944: sum

    题意 求\(\sum_{i=1}^{n}\varphi(i)和\sum_{i=1}^{n}\mu(i)\) \(n <= 2^{31}-1\) 不会做啊... 只会线性筛,显然不能线性筛 这个时 ...

  6. 2019.02.12 bzoj3944: Sum(杜教筛)

    传送门 题意: 思路:直接上杜教筛. 知道怎么推导就很简单了,注意预处理的范围. 然后我因为预处理范围不对被zxyoi教育了(ldx你这个傻×两倍常数活该被卡TLE) 喜闻乐见 代码: #includ ...

  7. bzoj3944: Sum 杜教筛板子题

    板子题(卡常) 也可能是用map太慢了 /************************************************************** Problem: 3944 Us ...

  8. [bzoj3944] sum [杜教筛模板]

    题面: 传送门 就是让你求$ \varphi\left(i\right) $以及$ \mu\left(i\right) $的前缀和 思路: 就是杜教筛的模板 我们把套路公式拿出来: $ g\left( ...

  9. Min_25筛 学习笔记

    这儿只是一个简单说明/概括/总结. 原理见这: https://www.cnblogs.com/cjyyb/p/9185093.html https://www.cnblogs.com/zhoushu ...

随机推荐

  1. IIS初始化(预加载),解决第一次访问慢,程序池被回收问题

    你以为你可以慢,那是不可能的!你以为你可以不动,那也是不可能的! 河南是守株待兔故事情节的发源地,讲的是懒惰的农夫坐在树桩旁等待可爱的小毛兔撞树的故事,那么这种事情怎么可能天天出现呢!你以为的事并一定 ...

  2. 3.3 js函数

    1.函数语法: 函数声明的方式:function 函数名(参数1,参数2-){//函数体;}函数调用:函数名(参数1,参数2-); 函数内不一定都指定返回值. 如果需要指定返回值,可用 return ...

  3. 如何采用easyui tree编写简单角色权限代码

    首先每个管理员得对应一个角色: 而角色可以操作多个栏目,这种情况下我们可以采用tree多选的方式: 在页面上js代码: $('#Permission').dialog({ title: '栏目权限', ...

  4. arcgis api for js共享干货系列之一自写算法实现地图量算工具

    众所周知,使用arcgis api for js实现地图的量算工具功能,无非是调用arcgisserver的Geometry服务(http://localhost:6080/arcgis/rest/s ...

  5. 如何解决MSI类型的Sharepoint Server2016 安装即点即用的office 2016 plus问题

    前提 在sharepoint server 2016安装office 2016 plus提示如下错误: 解决方法 Ø 概念 1. 即点和即用的概念:即点即用是一种通过 Internet 安装和更新 O ...

  6. ArcGIS Engine开发之鹰眼视图

    鹰眼是GIS软件的必备功能之一.它是一个MapControl控件,主要用来表示数据视图中的地理范围在全图中的位置. 鹰眼一般具有的功能: 1)鹰眼视图与数据视图的地理范围保持同步. 2)数据视图的当前 ...

  7. 详解Paint的setXfermode(Xfermode xfermode)

    一.setXfermode(Xfermode xfermode) Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的“过渡”其实就是 ...

  8. 在 Debian 上安装 SQL Server vNext CTP1

    微软在开源 .NET Framework 之后,相继推出了跨平台的编辑器 Visual Studio Code,跨平台的 SQL Server 数据库 SQL Server vNext,Visual ...

  9. android Service介绍

    一.简介 android中service(服务)运行于后台,没有界面.和其他组件一样,service也运行在主线程中,因此不能用它来做耗时的请求或者动作.可以在服务中开启线程,在线程中做耗时操作.可以 ...

  10. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...