[2019HDU多校第一场][HDU 6588][K. Function]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6588
题目大意:求\(\sum_{i=1}^{n}gcd(\left \lfloor \sqrt[3]{i} \right \rfloor,i),\ n\leq 10^{21}\)
题解:考虑对\(\left \lfloor \sqrt[3]{i} \right \rfloor\)分块,将式子转换成\(\sum_{i=1}^{\left \lfloor \sqrt[3]{n} \right \rfloor}\sum_{j=i^3}^{(i+1)^3-1}gcd(i,j)\)
考虑函数\(f(n,m)=\sum_{i=1}^{m}gcd(n,i)\),由于\(gcd(x,y)=gcd(x\ mod\ y,y)\),可以得出$$f(n,m)=\sum_{i=1}^{m}gcd(n,i)=\left \lfloor \frac{m}{n} \right \rfloor\cdot f(n,n)+f(n,m\ mod\ n)$$
对于\(f(n,n)\)的值,可以通过枚举\(gcd\)的值求和得出\(f(n,n)=\sum_{d|n}^{ } d \cdot\phi(\frac{n}{d})\),线性筛预处理欧拉函数的值即可\(O(nlogn)\)预处理所有\(f(n,n)\)的值
对于\(f(n,m)\),同样可以得出,\(f(n,m)=\sum_{d|n}^{ } d \sum_{i| \frac{n}{d},i\leq \left \lfloor \frac{m}{d} \right \rfloor}^{ }\mu(i)\cdot\left \lfloor \frac{m}{id} \right \rfloor=\sum_{d|n}^{ } \phi(d)\cdot \left \lfloor \frac{m}{d} \right \rfloor\)
又由于\((i+1)^3-1=i^3+3i^2+3i\)是\(i\)的倍数,所以对于每个循环中的\(i\),有$$\sum_{j=i^3}^{(i+1)^3-1}gcd(i,j)=f(i,i^3+3i^2+3i)-f(i,i^3)+gcd(i,i^3)=(3i+3)\cdot f(i,i)+i$$
因此对于每个询问,最多只需要求一次\(f(n,m)\)就好(即最后的\(i\)),而求一次\(f(n,m)\)的时间复杂度为\(O(\sqrt{n})\),所以每次询问的复杂度是\(O(n+\sqrt{n})\)。又因为有多组询问,可以考虑通过离线处理将总的时间复杂度降为\(O(nlogn+T\sqrt{n})\),这里\(n\)指的是\(10^7\)
这题的出题人原本是卡了非线性的做法,但是可以通过一定的常数优化使得\(O(nlogn)\)的做法通过
#include<bits/stdc++.h>
using namespace std;
#define N 10000001
#define MOD 998244353
int n,g[N],phi[N],p[N],cnt,res[],flg[N];
struct rua
{
int id;
__int128 n;
bool operator <(const rua &t)const{return n<t.n;}
}a[];
void read(__int128 &x)
{
static char ch;static bool neg;
for(ch=neg=;ch<'' || ''<ch;neg|=ch=='-',ch=getchar());
for(x=;''<=ch && ch<='';(x*=)+=ch-'',ch=getchar());
x=neg?-x:x;
}
void pretype()
{
phi[]=;
for(int i=;i<N;i++)
{
if(!flg[i])p[++cnt]=i,phi[i]=i-;
for(int j=;j<=cnt && i*p[j]<N;j++)
{
flg[i*p[j]]=;
if(i%p[j]==)
{
phi[i*p[j]]=p[j]*phi[i];
break;
}
phi[i*p[j]]=(p[j]-)*phi[i];
}
}
for(int d=;d*d<N;d++)
for(int n=d*d;n<N;n+=d)
{
g[n]=(g[n]+1ll*d*phi[n/d])%MOD;
if(d*d<n)g[n]=(g[n]+1ll*(n/d)*phi[d])%MOD;
}
}
inline int F(int n,__int128 M)
{
int res=(M/n)*g[n]%MOD;
int m=M%n;
if(m==)return res;
for(int i=;i*i<=n;i++)
{
int j=n/(n/i);
if(n%i==)
{
res=(res+1ll*phi[i]*(m/i))%MOD;
if(i*i<n)res=(res+1ll*phi[n/i]*(m/(n/i)))%MOD;
}
i=j;
}
return res;
}
int main()
{
pretype();
scanf("%d",&n);
for(int i=;i<=n;i++)
read(a[i].n),a[i].id=i;
sort(a+,a+n+);
int ans=,j=;
__int128 i=;
while(i*i*i<=a[n].n)
{
__int128 r=((i+)*i+)*i;
ans=(ans+MOD-(i*i*g[i]%MOD)+i)%MOD;
while(j<=n && a[j].n<r)
{
res[a[j].id]=(ans+F(i,a[j].n%i)+(a[j].n/i)*g[i])%MOD;
j++;
}
ans=(ans+((i+)*i+)*g[i])%MOD;
while(j<=n && a[j].n==r)
res[a[j++].id]=ans;
i++;
}
for(int i=;i<=n;i++)
printf("%d\n",res[i]);
}
[2019HDU多校第一场][HDU 6588][K. Function]的更多相关文章
- [2019HDU多校第一场][HDU 6578][A. Blank]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题目大意:长度为\(n\)的数组要求分别填入\(\{0,1,2,3\}\)四个数中的任意一个,有 ...
- [2019HDU多校第一场][HDU 6580][C. Milk]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6580 题目大意:\(n\times m\)大小的方格上有\(k\)瓶水,喝完每瓶水都需要一定的时间.初 ...
- [2019HDU多校第一场][HDU 6584][G. Meteor]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6584 题目大意:求所有满足\(0<\frac{p}{q}\leq1, gcd(p,q)=1,p\ ...
- [2019HDU多校第一场][HDU 6590][M. Code]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6590 题目大意(来自队友):二维平面上有\(n\)个点,每个点要么是黑色要么是白色,问能否找到一条直线 ...
- 2019HDU多校第一场1001 BLANK (DP)(HDU6578)
2019HDU多校第一场1001 BLANK (DP) 题意:构造一个长度为n(n<=10)的序列,其中的值域为{0,1,2,3}存在m个限制条件,表示为 l r x意义为[L,R]区间里最多能 ...
- [2019HDU多校第二场][HDU 6591][A. Another Chess Problem]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6591 题目大意:二维坐标系上,所有满足\(5|2x+y\)的点都被设为障碍物,无法通过.现给出一对点, ...
- 2019HDU多校第一场 BLANK DP
题意:有四种数字,现在有若干个限制条件:每个区间中不同的数字种类必须是多少种,问合法的方案数. 思路: 定义 dp[i][j][k][t] 代表填完前 t 个位置后,{0,1,2,3} 这 4 个数字 ...
- 2019HDU多校第一场 String 贪心
题意:给你一个字符串,问是否存在一个长度为m的子序列,子序列中对应字符的数目必须在一个范围内,问是否存在这样的字符串?如果存在,输出字典序最小的那个. 思路:贪心,先构造一个序列自动机,序列自动机指向 ...
- 2019HDU多校第一场 6582 Path 【最短路+最大流最小割】
一.题目 Path 二.分析 首先肯定要求最短路,然后如何确定所有的最短路其实有多种方法. 1 根据最短路,那么最短路上的边肯定是可以满足$dist[from] + e.cost = dist[to] ...
随机推荐
- Nuxt.js入门学习
Nuxt.js简单的说是Vue.js的通用框架,最常用的就是用来作SSR(服务器端渲染).再直白点说,就是Vue.js原来是开发SPA(单页应用)的,但是随着技术的普及,很多人想用Vue开发多页应用, ...
- java类和对象详解
类和对象 java 是面向对象的语言 即 万物皆对象c语言是面向过程语言 一.怎么去描述一个对象? (1)..静态的(短时间内不会改变的东西) 例如:外观,颜色,品牌 (2).动态的(动作) 可以干什 ...
- neo4j 将一个节点的属性复制到另一个节点上
在使用Python操作Neo4j数据库的时候,经常会遇到重复的节点,需要将一个节点的属性复制到另一个节点,之后将该节点删除. def copy_node_properties(source_node_ ...
- mysql中比较实用的几个函数
1.曾有这样的需求: 可以使用如下函数: 语法:FIND_IN_SET(str,strlist). 定义: 1. 假如字符串str在由N子链组成的字符串列表strlist中,则返回值的范围在1到N之间 ...
- 记2017年年底,几次Python后端面试
1. 果壳 电话面试: 说一下TCP的三次握手,四次挥手,为什么会这样? http安全的性的了解,说一下对cookie和session的了解: 对mysql的了解,说一下你常用的数据类型,char和v ...
- Kubernetes---Pod笔记
⒈pod的理解 将多个容器镜像融合在一起,共享网络命名空间及容器卷 ⒉pod的分类 自助式podv 不是被控制器管理的pod,它一旦死亡不会被人给拉起来. 控制器管理的pod ...
- select key from table 一直出错
key和keys 为mysql 关键字,数据库设计字段的时候尽量避免
- 【php设计模式】单例模式
实现单例的三个关键点: 1.使用一个静态成员来保持一个单例实例 2.一个私有的构造方法使得该类只能在类的内部方法中被实例化 3.在实例化对象的静态方法中,先判断静态变量是否已经被赋值,如果赋值则返回该 ...
- 基础python规范
一.注释 合理的代码注释应该占源代码的 1/3 左右,Python 语言允许在任何地方插入空字符或注释,但不能插入到标识符和字符串中间. 在 Python 中,通常包括 3 种类型的注 ...
- 请定义一个函数quadratic(a, b, c),接收3个参数,返回一元二次方程 ax^2+bx+c=0ax 2 +bx+c=0 的两个解。
#!/usr/bin/python # 导入math包 import math def quadratic(a, b, c): if not isinstance(a, (int, float))an ...