LOJ6686 Stupid GCD(数论,欧拉函数,杜教筛)
做题重心转移到 LOJ 了。
至于为什么,如果你知道“……”的密码,就去看吧。
LOJ 上用户自创题大多数都不可做,今天看到个可做题(而且还是个水题),就来做了一发。
明显枚举立方根。(以下令 $m=\lfloor\sqrt[3]{n}\rfloor$)
$$\sum\limits_{i=1}^m\sum\limits_{j=i^3}^{\min(n,(i+1)^3-1)}\gcd(i,j)$$
由于 $i=m$ 比较特殊,我们把它拎出来:(其实就是把 $\min$ 拆开)
$$\sum\limits_{i=1}^{m-1}\sum\limits_{j=i^3}^{(i+1)^3-1}\gcd(i,j)+\sum_{j=m^3}^n\gcd(m,j)$$
现在考虑 $\sum\limits_{i=1}^n\gcd(x,i)$ 怎么求。
$$\sum\limits_{i=1}^n\sum\limits_{d|(x,i)}\varphi(d)$$
$$\sum\limits_{d|x}\varphi(d)\lfloor\frac{n}{d}\rfloor$$
那么套回去:
$$\sum\limits_{i=1}^{m-1}\sum\limits_{d|i}\varphi(d)(\lfloor\frac{(i+1)^3-1}{d}\rfloor-\lfloor\frac{i^3-1}{d}\rfloor)+\sum\limits_{d|m}\varphi(d)(\lfloor\frac{n}{d}\rfloor-\lfloor\frac{m^3-1}{d}\rfloor)$$
后面那部分可以直接枚举因数,暴力求欧拉函数。我这里预处理了前 $10^7\approx m^{\frac{2}{3}}$ 个欧拉函数,时间复杂度是远远小于 $O(m^{\frac{2}{3}})$ 的。
接下来继续推前面的:
$$\sum\limits_{i=1}^{m-1}\sum\limits_{d|i}\varphi(d)(\lfloor\frac{(i+1)^3-1}{d}\rfloor-\lfloor\frac{i^3-1}{d}\rfloor)$$
$$\sum\limits_{d=1}^{m-1}\varphi(d)\sum\limits_{i=1}^{\lfloor\frac{m-1}{d}\rfloor}(\lfloor\frac{(id+1)^3-1}{d}\rfloor-\lfloor\frac{(id)^3-1}{d}\rfloor)$$
$$\sum\limits_{d=1}^{m-1}\varphi(d)\sum\limits_{i=1}^{\lfloor\frac{m-1}{d}\rfloor}(\lfloor\frac{(id)^3+3(id)^2+3(id)}{d}\rfloor-\lfloor\frac{(id)^3-1}{d}\rfloor)$$
$$\sum\limits_{d=1}^{m-1}\varphi(d)\sum\limits_{i=1}^{\lfloor\frac{m-1}{d}\rfloor}((i^3d^2+3i^2d+3i)-(\lfloor i^3d^2-\frac{1}{d}\rfloor))$$
$$\sum\limits_{d=1}^{m-1}\varphi(d)\sum\limits_{i=1}^{\lfloor\frac{m-1}{d}\rfloor}((i^3d^2+3i^2d+3i)-(i^3d^2-1))$$
$$\sum\limits_{d=1}^{m-1}\varphi(d)\sum\limits_{i=1}^{\lfloor\frac{m-1}{d}\rfloor}(3i^2d+3i+1)$$
$$\sum\limits_{d=1}^{m-1}d\varphi(d)\sum\limits_{i=1}^{\lfloor\frac{m-1}{d}\rfloor}3i^2+\sum\limits_{d=1}^{m-1}\varphi(d)\sum\limits_{i=1}^{\lfloor\frac{m-1}{d}\rfloor}(3i+1)$$
分块杜教筛即可。
时间复杂度:由于每次分块杜教筛都跑得过 $10^{10}$,我就姑且当它是 $O(m^{\frac{2}{3}})$ 的。所以时间复杂度 $O(n^{\frac{2}{9}})$。
upd: 已经会证复杂度是 $O(m^{\frac{2}{3}})$ 了。如果用 map 是可以做到这个复杂度(忽略那个 $\log$ 啦),但如果用其他什么奇怪的记忆化方法复杂度可能退化到 $O(m^{\frac{5}{6}})$。
代码很丑。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef __int128 lll;
const int maxn=,mod=,inv6=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline lll read(){
char ch=getchar();lll x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
lll n,nn;
int pr[maxn],pl,phi[maxn],pre1[maxn],pre2[maxn],ans;
bool vis[maxn];
map<ll,int> p1,p2;
ll cb,cb1;
void init(int upr){
phi[]=;
FOR(i,,upr){
if(!vis[i]) phi[pr[++pl]=i]=i-;
FOR(j,,pl){
if(i*pr[j]>upr) break;
vis[i*pr[j]]=true;
if(i%pr[j]) phi[i*pr[j]]=phi[i]*(pr[j]-);
else{
phi[i*pr[j]]=phi[i]*pr[j];break;
}
}
}
pre1[]=pre2[]=;
FOR(i,,upr){
pre1[i]=(pre1[i-]+phi[i])%mod;
pre2[i]=(pre2[i-]+1ll*phi[i]*i)%mod;
}
}
int s1(ll n){
int nn=n%mod;
return 1ll*nn*(nn+)/%mod;
}
int s1(ll l,ll r){return (s1(r)-s1(l-)+mod)%mod;}
int s2(ll n){
int nn=n%mod;
return 1ll*nn*(nn+)%mod*(*nn+)%mod*inv6%mod;
}
int s2(ll l,ll r){return (s2(r)-s2(l-)+mod)%mod;}
int S1(ll n){
if(n<=) return pre1[n];
if(p1.count(n)) return p1[n];
int nn=n%mod,s=1ll*nn*(nn+)/%mod;
for(ll l=,r;l<=n;l=r+){
r=n/(n/l);
s=(s-1ll*(r-l+)%mod*S1(n/l)%mod+mod)%mod;
}
return p1[n]=s;
}
int S2(ll n){
if(n<=) return pre2[n];
if(p2.count(n)) return p2[n];
int nn=n%mod,s=1ll*nn*(nn+)%mod*(*nn+)%mod*inv6%mod;
for(ll l=,r;l<=n;l=r+){
r=n/(n/l);
s=(s-1ll*s1(l,r)*S2(n/l)%mod+mod)%mod;
}
return p2[n]=s;
}
int calc_phi(ll n){
if(n<=) return phi[n];
ll s=n;
for(ll i=;i*i<=n;i++) if(n%i==){
s=s/i*(i-);
while(n%i==) n/=i;
}
if(n>) s=s/n*(n-);
return s%mod;
}
int calc(ll x){
int s=;
for(ll i=;i*i<=x;i++) if(x%i==){
s=(s+1ll*calc_phi(i)*((n/i)%mod-(nn/i)%mod+mod)%mod)%mod;
if(i*i!=x) s=(s+1ll*calc_phi(x/i)*((n/(x/i))%mod-(nn/(x/i))%mod+mod)%mod)%mod;
}
return s;
}
int main(){
n=read();
cb=pow(n,1.0/);cb1=cb-;
nn=(lll)cb*cb*cb-;
init(min(cb,10000000ll));
for(ll l=,r;l<=cb1;l=r+){
r=cb1/(cb1/l);
ans=(ans+3ll*s2(,cb1/l)*(S2(r)-S2(l-)+mod)%mod+(3ll*s1(,cb1/l)+cb1/l)%mod*(S1(r)-S1(l-)+mod)%mod)%mod;
}
printf("%d\n",(ans+calc(cb))%mod);
}
upd:
被出题人针对着卡,结果真卡掉了……
其实是开立方根出精度问题了,改一改就好了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef __int128 lll;
const int maxn=,mod=,inv6=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline lll read(){
char ch=getchar();lll x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
lll n,nn;
int pr[maxn],pl,phi[maxn],pre1[maxn],pre2[maxn],ans;
bool vis[maxn];
map<ll,int> p1,p2;
ll cb,cb1;
void init(int upr){
phi[]=;
FOR(i,,upr){
if(!vis[i]) phi[pr[++pl]=i]=i-;
FOR(j,,pl){
if(i*pr[j]>upr) break;
vis[i*pr[j]]=true;
if(i%pr[j]) phi[i*pr[j]]=phi[i]*(pr[j]-);
else{
phi[i*pr[j]]=phi[i]*pr[j];break;
}
}
}
pre1[]=pre2[]=;
FOR(i,,upr){
pre1[i]=(pre1[i-]+phi[i])%mod;
pre2[i]=(pre2[i-]+1ll*phi[i]*i)%mod;
}
}
int s1(ll n){
int nn=n%mod;
return 1ll*nn*(nn+)/%mod;
}
int s1(ll l,ll r){return (s1(r)-s1(l-)+mod)%mod;}
int s2(ll n){
int nn=n%mod;
return 1ll*nn*(nn+)%mod*(*nn+)%mod*inv6%mod;
}
int s2(ll l,ll r){return (s2(r)-s2(l-)+mod)%mod;}
int S1(ll n){
if(n<=) return pre1[n];
if(p1.count(n)) return p1[n];
int nn=n%mod,s=1ll*nn*(nn+)/%mod;
for(ll l=,r;l<=n;l=r+){
r=n/(n/l);
s=(s-1ll*(r-l+)%mod*S1(n/l)%mod+mod)%mod;
}
return p1[n]=s;
}
int S2(ll n){
if(n<=) return pre2[n];
if(p2.count(n)) return p2[n];
int nn=n%mod,s=1ll*nn*(nn+)%mod*(*nn+)%mod*inv6%mod;
for(ll l=,r;l<=n;l=r+){
r=n/(n/l);
s=(s-1ll*s1(l,r)*S2(n/l)%mod+mod)%mod;
}
return p2[n]=s;
}
int calc_phi(ll n){
if(n<=) return phi[n];
ll s=n;
for(ll i=;i*i<=n;i++) if(n%i==){
s=s/i*(i-);
while(n%i==) n/=i;
}
if(n>) s=s/n*(n-);
return s%mod;
}
int calc(ll x){
int s=;
for(ll i=;i*i<=x;i++) if(x%i==){
s=(s+1ll*calc_phi(i)*((n/i)%mod-(nn/i)%mod+mod)%mod)%mod;
if(i*i!=x) s=(s+1ll*calc_phi(x/i)*((n/(x/i))%mod-(nn/(x/i))%mod+mod)%mod)%mod;
}
return s;
}
int main(){
n=read();
cb=pow(n,1.0/);
while((lll)cb*cb*cb<=n) cb++;
while((lll)cb*cb*cb>n) cb--;
cb1=cb-;
nn=(lll)cb*cb*cb-;
init(min(cb,10000000ll));
for(ll l=,r;l<=cb1;l=r+){
r=cb1/(cb1/l);
ans=(ans+3ll*s2(,cb1/l)*(S2(r)-S2(l-)+mod)%mod+(3ll*s1(,cb1/l)+cb1/l)%mod*(S1(r)-S1(l-)+mod)%mod)%mod;
}
printf("%d\n",(ans+calc(cb))%mod);
}
LOJ6686 Stupid GCD(数论,欧拉函数,杜教筛)的更多相关文章
- BZOJ4916 神犇和蒟蒻(欧拉函数+杜教筛)
第一问是来搞笑的.由欧拉函数的计算公式容易发现φ(i2)=iφ(i).那么可以发现φ(n2)*id(n)(此处为卷积)=Σd*φ(d)*(n/d)=nΣφ(d)=n2 .这样就有了杜教筛所要求的容易算 ...
- BZOJ4916 神犇和蒟蒻 【欧拉函数 + 杜教筛】
题目 很久很久以前,有一只神犇叫yzy; 很久很久之后,有一只蒟蒻叫lty; 输入格式 请你读入一个整数N;1<=N<=1E9,A.B模1E9+7; 输出格式 请你输出一个整数A=\sum ...
- 51nod 1238 最小公倍数之和 V3 【欧拉函数+杜教筛】
首先题目中给出的代码打错了,少了个等于号,应该是 G=0; for(i=1;i<=N;i++) for(j=1;j<=N;j++) { G = (G + lcm(i,j)) % 10000 ...
- bzoj 3944: Sum【莫比乌斯函数+欧拉函数+杜教筛】
一道杜教筛的板子题. 两个都是积性函数,所以做法是一样的.以mu为例,设\( f(n)=\sum_{d|n}\mu(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1} ...
- 51nod 1227 平均最小公倍数【欧拉函数+杜教筛】
以后这种题能用phi的就不要用mu-mu往往会带着个ln然后被卡常致死 把题目要求转换为前缀和相减的形式,写出来大概是要求这样一个式子: \[ \sum_{i=1}^{n}\sum_{j=1}^{i} ...
- 51nod 1239 欧拉函数之和【欧拉函数+杜教筛】
和bzoj 3944比较像,但是时间卡的更死 设\( f(n)=\sum_{d|n}\phi(d) g(n)=\sum_{i=1}^{n}f(i) s(n)=\sum_{i=1}^{n}\phi(i) ...
- 【luogu3768】简单的数学题 欧拉函数(欧拉反演)+杜教筛
题目描述 给出 $n$ 和 $p$ ,求 $(\sum\limits_{i=1}^n\sum\limits_{j=1}^nij\gcd(i,j))\mod p$ . $n\le 10^{10}$ . ...
- bzoj 2818 GCD 数论 欧拉函数
bzoj[2818]Gcd Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Samp ...
- BZOJ-2190 仪仗队 数论+欧拉函数(线性筛)
今天zky学长讲数论,上午水,舒爽的不行..后来下午直接while(true){懵逼:}死循全程懵逼....(可怕)Thinking Bear. 2190: [SDOI2008]仪仗队 Time Li ...
- 【bzoj2818】: Gcd 数论-欧拉函数
[bzoj2818]: Gcd 考虑素数p<=n gcd(xp,yp)=p 当 gcd(x,y)=1 xp,yp<=n满足条件 p对答案的贡献: 预处理前缀和就好了 /* http://w ...
随机推荐
- mysql用户与权限操作
本文所有操作均在mysql8.1下验证,mysql5.x部分语句不适用. 1.创建用户 '; # 创建用户test,密码123456,%表示允许在所有主机登陆 用户表为mysql库小的user表,Ho ...
- ES6中有关数组的一些新操作
1.Array.isArray() 用于确定传递的值是否是一个 Array. Array.isArray([1, 2, 3]); // true Array.isArray({foo: 123}); ...
- python 多进程和多线程对比
1. 对于耗费CPU的操作来说,多进程优于多线程 2. 对于耗费IO操作来说,多线程优于多进程 3. 多进程切换代价大于多线程
- 使用jstack排查多线程死锁、阻塞
问题: 针对线上多线程死锁.阻塞,跑着跑着就卡住了 查看线上线程池的状态 jstack用于生成java虚拟机当前时刻的线程快照. 线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成 ...
- Django学习笔记(18)——BBS+Blog项目开发(2)主体思路及流程
这篇博客主要完成一个BBS+Blog项目,那么主要是模仿博客园的博客思路,使用Django框架进行练习. 准备:项目需求分析 在做一个项目的时候,我们首先做的就是谈清楚项目需求,功能需求,然后才开始写 ...
- Kubernetes service 代理模式
Kubernetes service 代理模式 底层流量转发与负载均衡实现:• Iptables(默认)• IPVS IPVS 了解代理模式之IPVS工作原理LVS 基于 IPVS内核调度模块实现的负 ...
- dedecms5.7文章页的标签随机插入到内容中并且标签的地址为其标签关联的其他文章地址
dedecms5.7文章页的标签随机插入到内容中并且标签的地址为其他标签关联的文章地址 1 添加2个自定义函数 在dede/include/extend.func.php底部 添加如下代码 //根据文 ...
- SpringBoot2.x|Thymeleaf页面不能正常载入css、js文件
1.实现实现WebMvcConfig配置类可以解决页面不能加载css,js的问题: 扩展SpringMvc,编写一个配置类(@Configuration),是WebMvcConfigurationAd ...
- JVM 学习总结
目录 Java内存区域 运行时数据区 & Java 内存结构 & Java 内存区域 1. 程序计数器 2. Java 虚拟机栈 3. 本地方法栈 4. 堆 5. 方法区 6. 运行时 ...
- jQuery 遍历方法大全
下表列出了用于jQuery 遍历所有方法. 方法 描述 add() 将元素添加到匹配的元素集中 addBack() 将上一组元素添加到当前组中 andSelf() 在版本1.8中已弃用. addBac ...