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\),且保证\(ab\)互质,求\(f(n,a,b)\)
思路:
由不知道什么得:当\(ab\)互质,则\(gcd(i^a-j^a,i^b-j^b)=i-j\)。
那么可转化为:
&\sum_{i=1}^n\sum_{j=1}^ii-j[gcd(i,j)=1]\mod 1e9+7\\
=&\sum_{i=1}^ni\varphi(i)-\frac{i*\varphi(i)}{2}\\
=&\frac{1}{2}(\sum_{i=1}^ni\varphi(i) \ \ \ - 1)
\end{aligned}
\]
那么问题转化为求:\(\sum_{i=1}^ni\varphi(i)\),因为前缀和有点大,所以估计要用到杜教筛,所以先卷积一下:
(f*g)(n)=&\sum_{d|n}f(d)g(\frac{n}{d})\\
=&\sum_{d|n}i\varphi(i)g(\frac{n}{d})
\end{aligned}
\]
为了让卷积完的\(h\)和\(g\)前缀更好求,那么这里不如令\(g=id\),那么\((f*g)(n)=n*\sum_{d|n}\varphi(d)\),又因为\(\varphi*I=id\),故\((f*g)(n)=n^2\)。
所以可得终式:
\]
因为超过\(1e6\)只有\(10\)组,所以我这里直接手动哈希比\(map\)快一点。
代码:
#include<map>
#include<set>
#include<cmath>
#include<cstdio>
#include<stack>
#include<ctime>
#include<vector>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<iostream>
#include<algorithm>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int maxn = 4e6 + 5;
const ll MOD = 1e9 + 7;
const ull seed = 131;
const int INF = 0x3f3f3f3f;
int mark[maxn], prime[maxn], tot;
ll phi[maxn];
void init(int n){
tot = 0;
int i, j;
phi[1] = 1;
for(i = 2; i <= n; i++){
if(!mark[i]){
prime[++tot] = i;
phi[i] = i - 1;
}
for(j = 1; j <= tot; j++){
if(i * prime[j] > n) break;
mark[i * prime[j]] = 1;
if(i % prime[j] == 0){
phi[i * prime[j]] = phi[i] * prime[j];
break;
}
else phi[i * prime[j]] = phi[i] * (prime[j] - 1);
}
}
phi[0] = 0;
for(int i = 1; i <= n; i++){
phi[i] = (1LL * phi[i] * i + phi[i - 1]) % MOD;
}
}
ll inv6 = 166666668, inv2 = 500000004;
ll mphi[100000], UP;
int vis[100000];
int N = 4e6;
ll getans(int x){
return x <= N? phi[x] : mphi[UP / x];
}
ll ksc(ll a, ll b, ll p){
ll t = a * b - (ll)((long double)a * b / p + 0.5) * p;
return (t < 0)? t + p : t;
}
void solve(int n){
int t = UP / n;
if(n <= N) return;
if(vis[t]) return;
vis[t] = 1;
mphi[t] = ksc(ksc(n, n + 1, MOD), 2 * n + 1, MOD) * inv6 % MOD;
for(int l = 2, r; l <= n; l = r + 1){
r = n / (n / l);
solve(n / l);
mphi[t] -= 1LL * (l + r) * (r - l + 1) % MOD * inv2 % MOD * getans(n / l) % MOD;
mphi[t] %= MOD;
}
}
int main(){
int T;
init(N);
// init(N + 1);
// printf("%lld\n", (phi[N + 1] - 1) * inv2 % MOD);
scanf("%d", &T);
while(T--){
ll ans;
int n, a, b;
scanf("%d%d%d", &n, &a, &b);
if(n <= N) ans = phi[n];
else{
UP = n;
memset(vis, 0, sizeof(vis));
solve(n), ans = mphi[1];
}
ans = (ans - 1) * inv2;
ans = (ans % MOD + MOD) % MOD;
printf("%lld\n", ans);
}
return 0;
}
HDU 6706 huntian oy(杜教筛 + 一些定理)题解的更多相关文章
- CCPC 2019 网络赛 HDU huntian oy (杜教筛)
1005 huntian oy (HDU 6706) 题意: 令,有T次询问,求 f(n, a, b). 其中 T = 10^4,1 <= n,a,b <= 1e9,保证每次 a,b互质. ...
- HDU6706 huntian oy(2019年CCPC网络赛+杜教筛)
目录 题目链接 思路 代码 题目链接 传送门 思路 看到这题还比较懵逼,然后机房大佬板子里面刚好有这个公式\(gcd(a^n-b^n,a^m-b^m)=a^{gcd(n,m)}-b^{gcd(n,m) ...
- [HDU 5608]Function(莫比乌斯反演 + 杜教筛)
题目描述 有N2−3N+2=∑d∣Nf(d)N^2-3N+2=\sum_{d|N} f(d)N2−3N+2=∑d∣Nf(d) 求∑i=1Nf(i)\sum_{i=1}^{N} f(i)∑i=1Nf ...
- HDU 5608 function(莫比乌斯反演 + 杜教筛)题解
题意: 已知\(N^2-3N+2=\sum_{d|N}f(d)\),求\(\sum_{i=1}^nf(i) \mod 1e9+7\),\(n\leq1e9\) 思路: 杜教筛基础题? 很显然这里已经设 ...
- HDU 6987 - Cycle Binary(找性质+杜教筛)
题面传送门 首先 mol 一发现场 AC 的 csy 神仙 为什么这题现场这么多人过啊啊啊啊啊啊 继续搬运官方题解( 首先对于题目中的 \(k,P\),我们有若存在字符串 \(k,P,P'\) 满 ...
- luoguP4213 【模板】杜教筛(Sum)杜教筛
链接 luogu 思路 为了做hdu来学杜教筛. 杜教筛模板题. 卡常数,我加了register居然跑到不到800ms. 太深了. 代码 // luogu-judger-enable-o2 #incl ...
- 51nod 1244 莫比乌斯函数之和(杜教筛)
[题目链接] http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244 [题目大意] 计算莫比乌斯函数的区段和 [题解] 利 ...
- 51nod 1237 最大公约数之和 V3(杜教筛)
[题目链接] https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1237 [题目大意] 求[1,n][1,n]最大公约数之和 ...
- 杜教筛 && bzoj3944 Sum
Description Input 一共T+1行 第1行为数据组数T(T<=10) 第2~T+1行每行一个非负整数N,代表一组询问 Output 一共T行,每行两个用空格分隔的数ans1,ans ...
随机推荐
- python7、8章
目录 第七章 用户输入和while循环 7.1 函数input()的工作原理 7.1.1 编写清晰的程序 7.1.2 使用int()来获取数值输入 分析: 结果: 7.1.3 求模运算符 7.1.4 ...
- 给dtcms增加模板自动生成功能
作为dtcms的使用者你是不是像我一样,也在不停的修改模板之后要点击生成模板浪费了很多开发模板的时间? 那就跟我一起给dtcms增加一个开发者模式,当模板修改完成之后,直接刷新页面就能看到效果,而不再 ...
- 数据分析——Numpy/pandas
NumPy NumPy是高性能科学计算和数据分析的基础包.部分功能如下: ndarray, 具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组. 用于对整组数据进行快速运算的标准数学函数(无需编 ...
- 转 12 jmeter性能测试实战--web程序
12 jmeter性能测试实战--web程序 项目背景 项目:XX网站环境:Windows需求:并发登录的性能测试场景:1s增加2个线程,运行2000次(线程数20,Ramp-Up seconds ...
- JavaScript中创建对象的三种方式!
JavaScript中创建对象的三种方式! 第一种 利用对象字面量! // 创建对象的三种方式! // 1 对象字面量. var obj = { // 对象的属性和方法! name: 'lvhang' ...
- RabbitMq消费者在初始配置之后进行数据消费
RabbitMq消费者在初始配置之后进行数据消费 问题背景 在写一个消费rabbitmq消息的程序是,发现了一个问题,消费者的业务逻辑里面依赖这一些配置信息,但是当项目启动时,如果队列里面有积压数据的 ...
- Spring Data JPA基本增删改查和JPQL查询(含完整代码和视频连接)
问题:SpringDataJPA怎么使用? 一.考察目标 主要考核SpringDataJPA的用法 二.题目分析 spring data jpa 的使用步骤(下面有具体实现细节) 1.创建maven工 ...
- 「THP3考前信心赛」题解
目录 写在前面 A 未来宇宙 B 空海澄澈 C 旧约酒馆 算法一 算法二 D 博物之志 算法一 算法二 算法三 写在前面 比赛地址:THP3 考前信心赛. 感谢原出题人的贡献:第一题 CF1422C, ...
- Codeforces 1220D 思维 数学 二分图基础
原题链接 题意 我们有一个含多个正整数的集合B,然后我们将所有的整数,也就是Z集合内所有元素,都当做顶点 两个整数 \(i , j\) 能建立无向边,当且仅当 \(|i - j|\) 这个数属于B集合 ...
- PowerBI系列组件关系详解
随着数据分析工具的不断更新,我们所熟知的Excel可能已经不是你想象中的样子了. Excel和Power BI又有何千丝万缕的联系? M语言和DAX语言又是什么样的存在? 操作他们又需要掌握什么样的技 ...