@hdu - 6607@ Easy Math Problem
@description@
求:
\]
@solution@
ans &= \sum_{i=1}^{n}\sum_{j=1}^{n}gcd^k(i, j)\times lcm(i, j)\times [gcd(i, j) \in prime] \\
&= \sum_{d=1}^{n}[d \in prime]\times d^{k+1}\sum_{i=1}^{\lfloor \frac{n}{d}\rfloor}\sum_{j=1}^{\lfloor \frac{n}{d}\rfloor}[gcd(i, j) = 1]\times i \times j
\end{aligned}
\]
后面那个是经典问题了。虽然明显可以莫比乌斯反演,不过注意到 i, j 取值范围相同,可以用欧拉函数。
基于结论 \(gcd(i, n) = gcd(n - i, n)\),与 n 互质的数总是成对存在,所以有:
\]
记 \(S(n) = \sum_{i=1}^{n}\phi(i)\times i^2\),可以用杜教筛求 \(S\)(能不用 min-25 筛就不用)。则:
\]
如果对 \(S(\lfloor \frac{n}{d}\rfloor)\) 分块,我们需要求质数的 k + 1 次幂的前缀和。其实就是 min-25 筛的前半部分。
@accepted code@
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MOD = int(1E9) + 7;
const int MAXN = 4650000;
inline int add(int x, int y) {return (x + y >= MOD ? x + y - MOD : x + y);}
inline int sub(int x, int y) {return (x - y < 0 ? x - y + MOD : x - y);}
inline int mul(int x, int y) {return 1LL * x * y % MOD;}
int pow_mod(int b, int p) {
int ret = 1;
for(int i=p;i;i>>=1,b=mul(b,b))
if( i & 1 ) ret = mul(ret, b);
return ret;
}
bool nprm[MAXN + 5];
int prm[MAXN + 5], phi[MAXN + 5], pcnt;
void sieve() {
phi[1] = 1;
for(int i=2;i<=MAXN;i++) {
if( !nprm[i] ) prm[++pcnt] = i, phi[i] = i - 1;
for(int j=1;i*prm[j]<=MAXN;j++) {
nprm[i*prm[j]] = true;
if( i % prm[j] == 0 ) {
phi[i*prm[j]] = phi[i]*prm[j];
break;
}
else phi[i*prm[j]] = phi[i]*phi[prm[j]];
}
}
}
int c[105][105], f[105][105];
void get_coef() {
for(int i=0;i<=102;i++) {
c[i][0] = 1;
for(int j=1;j<=i;j++)
c[i][j] = add(c[i-1][j], c[i-1][j-1]);
}
for(int i=0;i<=101;i++) {
for(int j=0;j<=i+1;j++)
f[i][j] = c[i+1][j];
for(int j=0;j<i;j++) {
for(int k=0;k<=j+1;k++)
f[i][k] = sub(f[i][k], mul(c[i+1][j], f[j][k]));
}
int iv = pow_mod(i + 1, MOD - 2);
for(int j=0;j<=i+1;j++)
f[i][j] = mul(f[i][j], iv);
}
}
int get_sum(int n, int k) {
int ret = 0;
for(int i=k+1;i>=0;i--)
ret = add(mul(ret, n), f[k][i]);
return ret;
}
int sum[MAXN + 5];
void init() {
sieve(), get_coef();
for(int i=1;i<=MAXN;i++)
sum[i] = add(sum[i-1], mul(mul(i, i), phi[i]));
}
ll n; int k;
int id1[MAXN + 5], id2[MAXN + 5], cnt;
int id(ll m) {return (m <= MAXN ? id1[m] : id2[n/m]);}
ll a[MAXN + 5]; int s[MAXN + 5];
void get_id() {
cnt = 0;
for(ll i=1;i<=n;i=(n/(n/i))+1) {
ll p = n / i;
if( p <= MAXN ) id1[p] = (++cnt);
else id2[n/p] = (++cnt);
a[cnt] = p, s[cnt] = -1;
}
}
int phisum(ll m) {
if( m <= MAXN ) return sum[m];
int &ans = s[id(m)];
if( ans != -1 ) return ans;
ans = get_sum(m % MOD, 3);
for(ll i=2;i<=m;i++) {
ll p = m / i, j = m / p;
ans = sub(ans, mul(sub(get_sum(j % MOD, 2), get_sum((i-1) % MOD, 2)), phisum(p)));
i = j;
}
return ans;
}
int dp[MAXN + 5];
void get_dp() {
for(int i=1;i<=cnt;i++) dp[i] = sub(get_sum(a[i] % MOD, k + 1), 1);
int tmp = 0;
for(int i=1;i<=pcnt;i++) {
ll sq = 1LL*prm[i]*prm[i]; int del = pow_mod(prm[i], k + 1);
if( sq > n ) break;
for(int j=1;j<=cnt;j++) {
if( sq > a[j] ) break;
dp[j] = sub(dp[j], mul(del, sub(dp[id(a[j] / prm[i])], tmp)));
}
tmp = add(tmp, del);
}
}
void solve() {
scanf("%lld%d", &n, &k), get_id(), get_dp();
int ans = 0;
for(ll i=1;i<=n;i++) {
ll p = n / i, j = n / p;
ans = add(ans, mul(sub(phisum(j), phisum(i - 1)), dp[id(p)]));
i = j;
}
printf("%d\n", ans);
}
int main() {
init();
int T; scanf("%d", &T);
while( T-- ) solve();
}
@details@
整除分块时所有数都必须取 long long,但是取模要转成 int。注意一下不要出锅。
@hdu - 6607@ Easy Math Problem的更多相关文章
- [HDU - 5170GTY's math problem 数的精度类
题目链接:HDU - 5170GTY's math problem 题目描述 Description GTY is a GodBull who will get an Au in NOI . To h ...
- HDU 5572--An Easy Physics Problem(射线和圆的交点)
An Easy Physics Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- 【HDU 5105】Math Problem
题意 f(x)=|ax3+bx2+cx+d| 求f(x)在L≤x≤R的最大值. 分析 参数有可能是0,注意分类讨论 1.当a=0时 b=0,f为一次函数(c≠0)或者常数函数(c=0),最大值点在区间 ...
- ACM 2015年上海区域赛A题 HDU 5572An Easy Physics Problem
题意: 光滑平面,一个刚性小球,一个固定的刚性圆柱体 ,给定圆柱体圆心坐标,半径 ,小球起点坐标,起始运动方向(向量) ,终点坐标 ,问能否到达终点,小球运动中如果碰到圆柱体会反射. 学到了向量模板, ...
- HDU 6182 A Math Problem
暴力. $k$的$k$次方在$k=15$的时候,达到了最大不爆掉的情况. #include<bits/stdc++.h> using namespace std; long long an ...
- HDU 5055 Bob and math problem(结构体)
主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=5055 Problem Description Recently, Bob has been think ...
- HDU 5572 An Easy Physics Problem (计算几何+对称点模板)
HDU 5572 An Easy Physics Problem (计算几何) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5572 Descripti ...
- HDU 1757 A Simple Math Problem 【矩阵经典7 构造矩阵递推式】
任意门:http://acm.hdu.edu.cn/showproblem.php?pid=1757 A Simple Math Problem Time Limit: 3000/1000 MS (J ...
- hdu 5105 Math Problem(数学)
pid=5105" target="_blank" style="">题目链接:hdu 5105 Math Problem 题目大意:给定a.b ...
随机推荐
- hdu4757 可持续字典树
Tree Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total Sub ...
- poj 2296
Map Labeler Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 2047 Accepted: 682 Descri ...
- LeetCode上的SQL练习
184. 部门工资最高的员工 SELECT D. NAME Department, E. NAME Employee, E.Salary FROM -- 内连接两张查询表 Employee E INN ...
- 在DAO的查询操作里,数据库查询到记录,sql语句也成功执行,但是返回的对象是null
在这里 如果改成User user=null; 后面 对user对象的赋值是会失败的. 原因: 要赋值的话,一定要有对象,要new一下给对象分配空间然后再给对象赋值.
- dubbo分布式应用
dubbo介绍: dubbo是一款分布式服务框架,支持高性能和透明化的RPC远程服务调用方案,每天为2千多个服务提供大于30亿次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点以及别的公司的业务中. ...
- Ef core 如何设置主键
在正题之前,先说明几个问题. (1)写 sql 不好吗,为什么要引入 ORM ? 总的来说由于需求的复杂性增加,引入了面向对象编程,进而有了 ORM ,ORM 使得开发人员以对象的方式表达业务逻辑.对 ...
- NodeJS——大汇总(一)(只需要使用这些东西,就能处理80%以上业务需求,全网最全node解决方案,吐血整理)
一.前言 本文目标 本文是博主总结了之前的自己在做的很多个项目的一些知识点,当然我在这里不会过多的讲解业务的流程,而是建立一个小demon,旨在帮助大家去更加高效 更加便捷的生成自己的node后台接口 ...
- 3.Linux如何管理分区
上一次谈完了硬盘与分区的基础知识,下面谈一下Linux如何管理分区. Linux管理硬件和windows完全不同.任何东西(包括硬件)在Linux看来都是文件设备,有字符和二进制形式的设备.如打印机. ...
- Intellij IDEA 2020.1.1 破解 永久有效 亲测100%成功
申明:本教程 WebStorm 破解补丁.激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除. 前言 作为一个有强迫症的码农,怎么能忍受自己的开发工具跟不上潮流呢?笔者以前一直用 ...
- eatwhatApp开发实战(七)
之前我们为app添加了读取本地数据的功能和删除的功能.本次我们来将listview上item项的触控修改为item项上单一控件的触控事件.用item项上的button来实现删除数据. 先上布局: &l ...