1005 huntian oy (HDU 6706

题意:

,有T次询问,求 f(n, a, b)。

其中 T = 10^4,1 <= n,a,b <= 1e9,保证每次 a,b互质。

思路:

首先我们需要知道

公式:  gcd(a^n - b^n, a^m - b^m) = a^(gcd(m,n)) - b^(gcd(m,n))

由a,b互质,原式即为

      f(n, a, b) = ∑∑ (i-j)*[(i,j)=1] = ∑ (i*∑ [(i, j)=1] ) - ∑∑ j*[(i, j)=1]

然后我们还要知道

欧拉函数定义式:    phi(n) =  ∑ [(i, n)=1]

1…n中与n互质的数的和: ∑ i*[(i, n)=1] = phi(n)*n / 2,n>1,(n==1时 和为1)

所以

      f(n, a, b) = ∑ i*phi(i) - (∑ phi(i)*i/2 + 1/2) = (∑ i*phi(i)  - 1) / 2

现在问题变成 求 i*phi(i) 的前缀和。由于 n 很大,达到 10^9,线性时间是不够的,要用到杜教筛

不懂杜教筛?出门右拐先去这篇博客研究研究。学会了可以先尝试本篇博客后面的模板题:洛谷P4213

预处理 √n 以内的前缀和后,剩下部分利用整除分块求解的时间复杂度为 O(n^(3/4)),预处理前 k = n^(2/3) 时 时间复杂度可以优化到 O(n^(2/3))。详见大佬的博客分析

AC代码:

#include <cstdio>
#include <unordered_map>
using namespace std;
const int mod = 1e9+;
const int MAXN = ; unordered_map<int, long long> Sumiphi;
int prime[MAXN+], cnt;
long long phi[MAXN+];
long long iphi[MAXN+];
bool isprime[MAXN+]; // 线性筛
void getPrime(int n) {
isprime[] = true;
phi[] = ;
for(int i=;i<=n;i++) {
if(!isprime[i])
prime[++cnt] = i, phi[i] = i-; for(int j=;j<=cnt&&prime[j]*i<=n;j++) {
isprime[prime[j]*i] = true;
phi[prime[j]*i] = phi[i]*(prime[j]-);
if(i%prime[j]==) {
phi[prime[j]*i] = phi[i]*(prime[j]);
break;
}
}
}
// 前缀和
for(int i=;i<=n;i++) {
iphi[i] = iphi[i-] + phi[i]*i % mod;
iphi[i] %= mod;
}
} const int _two = (+mod)/;
const int _six = ; // 杜教筛求 ∑i*phi(i)
// S(n) = ∑i^2 - ∑d*S(n/d) = n*(n+1)*(2n+1)/6 - ∑d×S(n/d)
long long iphiSum(int n) {
if(n<=MAXN)
return iphi[n];
if(Sumiphi.count(n))
return Sumiphi[n]; long long sum = ;
for(int i=,j;i<=n;i=j+) {
j = n/(n/i);
sum += iphiSum(n/i)*(j-i+)% mod *(i+j) % mod *_two % mod;
}
Sumiphi[n] = ((1LL*n*(n+)% mod *(*n+)% mod *_six % mod - sum)%mod + mod) % mod;
return Sumiphi[n];
} // 答案:
// ( Sum(i*phi(i)) - 1 ) /2
int main() {
getPrime(MAXN);
int T, n, a, b;
scanf("%d", &T);
while(T--) {
scanf("%d %d %d", &n, &a, &b);
printf("%lld\n", (iphiSum(n)-+mod)%mod * _two % mod);
}
return ;
}

P4213 【模板】杜教筛(Sum)

题意:

给定一个正整数 N (N<=2^31-1),求

AC模板:

#include <cstdio>
#include <unordered_map>
using namespace std;
// 参考自:https://www.cnblogs.com/dreagonm/p/10077979.html const int MAXN = ;
unordered_map<int, long long> Sumphi;
unordered_map<int, long long> Summu;
int prime[MAXN+], cnt;
long long mu[MAXN+], phi[MAXN+];
bool isprime[MAXN+]; // 线性筛
void getPrime(int n) {
isprime[] = true;
mu[] = ;
phi[] = ;
for(int i=;i<=n;i++) {
if(!isprime[i])
prime[++cnt] = i, phi[i] = i-, mu[i] = -; for(int j=;j<=cnt&&prime[j]*i<=n;j++) {
isprime[prime[j]*i] = true;
mu[prime[j]*i] = -mu[i];
phi[prime[j]*i] = phi[i]*(prime[j]-);
if(i%prime[j]==) {
mu[prime[j]*i] = ;
phi[prime[j]*i] = phi[i]*(prime[j]);
break;
}
}
}
// 前缀和
for(int i=;i<=n;i++) {
mu[i] += mu[i-];
phi[i] += phi[i-];
}
} // 杜教筛求 ∑u(i)
// S(n) = 1 - ∑S(n/d)
long long muSum(int n) {
if(n<=MAXN)
return mu[n];
if(Summu.count(n))
return Summu[n]; int sum = ;
for(int i=,j;i<=n;i=j+) {
j = n/(n/i);
sum += (j-i+)*muSum(n/i);
}
Summu[n] = - sum;
return Summu[n];
} // 杜教筛求 ∑phi(i)
// S(n) = ∑ i - ∑S(n/d)
long long phiSum(int n) {
if(n<=MAXN)
return phi[n];
if(Sumphi.count(n))
return Sumphi[n]; long long sum = ;
for(int i=,j;i<=n;i=j+) {
j = n/(n/i);
sum += (j-i+)*phiSum(n/i);
}
Sumphi[n] = 1LL*(n+)*n/ - sum;
return Sumphi[n];
} int main() {
getPrime(MAXN);
int T, n;
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
printf("%lld %d\n", phiSum(n), muSum(n));
}
return ;
}

CCPC 2019 网络赛 HDU huntian oy (杜教筛)的更多相关文章

  1. 2019.02.12 bzoj3944: Sum(杜教筛)

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

  2. CCPC 2019 网络赛 1006 Shuffle Card

    // 签到题,比赛时候写双向链表debug了半天,发现有更好方法,记录一下.   Shuffle Card HDU 6707 题意:   有一 \(n\) 张卡片,编号 \(1~n\) ,给定初始编号 ...

  3. CCPC 2019 网络赛 1002 array (权值线段树)

    HDU 6703 array   题意:   给定一个数组 \(a_1,a_2, a_3,...a_n\) ,满足 \(1 \le a[i]\le n\) 且 \(a[i]\) 互不相同.   有两种 ...

  4. HDU 5608 function [杜教筛]

    HDU 5608 function 题意:数论函数满足\(N^2-3N+2=\sum_{d|N} f(d)\),求前缀和 裸题-连卷上\(1\)都告诉你了 预处理\(S(n)\)的话反演一下用枚举倍数 ...

  5. luoguP4213 【模板】杜教筛(Sum)杜教筛

    链接 luogu 思路 为了做hdu来学杜教筛. 杜教筛模板题. 卡常数,我加了register居然跑到不到800ms. 太深了. 代码 // luogu-judger-enable-o2 #incl ...

  6. HDU6706 huntian oy(2019年CCPC网络赛+杜教筛)

    目录 题目链接 思路 代码 题目链接 传送门 思路 看到这题还比较懵逼,然后机房大佬板子里面刚好有这个公式\(gcd(a^n-b^n,a^m-b^m)=a^{gcd(n,m)}-b^{gcd(n,m) ...

  7. ccpc 网络赛 hdu 6155

    # ccpc 网络赛 hdu 6155(矩阵乘法 + 线段树) 题意: 给出 01 串,要么询问某个区间内不同的 01 子序列数量,要么把区间翻转. 叉姐的题解: 先考虑怎么算 \(s_1, s_2, ...

  8. 2019年南京网络赛E题K Sum(莫比乌斯反演+杜教筛+欧拉降幂)

    目录 题目链接 思路 代码 题目链接 传送门 思路 首先我们将原式化简: \[ \begin{aligned} &\sum\limits_{l_1=1}^{n}\sum\limits_{l_2 ...

  9. HDU 6706 huntian oy(杜教筛 + 一些定理)题解

    题意: 已知\(f(n,a,b)=\sum_{i=1}^n\sum_{j=1}^igcd(i^a-j^a,i^b-j^b)[gcd(i,j)=1]\mod 1e9+7\),\(n\leq1e9\),且 ...

随机推荐

  1. Codeigniter Session: Configured save path is not a directory

    Codeigniter 3.x Message: Session: Configured save path '' is not a directory, doesn't exist or canno ...

  2. Codeigniter设置时区

    Codeigniter 3.x,在application/config/config.php 末尾加上 date_default_timezone_set("Asia/Shanghai&qu ...

  3. mysql 8+ 忘记root密码 解决方案

    在安装完数据库后,由于自己不小心直接关闭了安装窗口,或者长时间没有使用root用户登录系统,导致忘记了root密码,这时就需要重置MySQL的root密码.当然,最简单方式自然是删除数据库的data目 ...

  4. natapp自动获取免费的动态端口域名

    前段时间,因为客户有个项目要求跨局域网进行远程控制桌面,想知道能不能实现.于是查询了许多资料,了解到需要有公网服务器作为中介才能够实现,但是公司又没有公网服务器,于是只有利用花生壳.natapp服务器 ...

  5. 数学相关比较 牛顿迭代法求开方 很多个n的平方分之一

    牛顿迭代法求开方 牛顿迭代法 作用: 求f(x) = 0 的解 方法:假设任意一点 x0, 求切线与x轴交点坐标x1, 再求切线与x轴交点坐标x2,一直重复,直到f(xn) 与0的差距在一个极小的范围 ...

  6. Tomcat下载部署及解决中文乱码显示

    一.下载 tomcat下载链接:https://tomcat.apache.org/ 1.进入tomcat官网后,我使用的是tomcat9,所以我选择tomcat9.然后点击core下的zip包下载. ...

  7. 20140422 ALT+F8 四个强制类型转换

    一.static_cast, dynamic_cast, const_cast http://www.cnblogs.com/chio/archive/2007/07/18/822389.html h ...

  8. fastReport.net 初了解

    delphi 中fastReport rmReport都很好用,转到.net了,第一想法也是这两个,好在这里有个fastReport; 这个安装呢 找个破解的 有个4.x版 安完建一个winForm  ...

  9. cors是什么?django中怎么解决这个问题?

    跨域资源共享(CORS) 是一种机制. 当一个资源从与该资源本身所在的服务器不同的域.协议或端口请求一个资源时,资源会发起一个跨域 HTTP 请求.(CORS是一种可以让你实现跨站点请求并同时阻止恶意 ...

  10. webservice - 使用JAX-WS注解的方式快速搭建服务端和客户端

    1.Define the interface import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebRe ...