51NOD1847:奇怪的数学题
Sol
设 \(f(d)\) 表示 \(d\) 所有约数中第二大的,\(low_d\) 表示 \(d\) 的最小质因子
\]
那么
\]
\]
\]
\]
\]
可以数论分块,后面的 \(\varphi\) 直接杜教筛
考虑计算
\]
设 \(p_j\) 表示第 \(j\) 个质数
\(g(x,i)\) 表示 \(2\) 到 \(x\) 之间最小质因子大于等于 \(p_i\) 的或者质数的 \(f\) 的 \(k\) 次方和
\(g'(x,i)\) 表示 \(2\) 到 \(x\) 之间最小质因子大于等于 \(p_i\) 的或者质数的 \(k\) 次方和
设 \(s(i)\) 表示小于等于 \(p_i\) 的质数的 \(k\) 次方和
那么就是要求 \(g(n, 1)\)
\(s\) 直接 \(min25\) 筛
\]
\]
这里要用到自然幂数和求和,用第二类斯特林数就好了
# include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
inline uint Pow(uint x, int y) {
register uint ret = 1;
for (; y; y >>= 1, x = x * x) if (y & 1) ret = ret * x;
return ret;
}
const int maxn(1e6 + 5);
int pr[maxn], tot, k, d, id1[maxn], id2[maxn], cnt, phi[maxn];
uint n, s[55][55], f[maxn], g[maxn], val[maxn], sk[maxn];
uint s1[maxn], s2[maxn], sphi[maxn], sp[maxn];
bitset <maxn> ispr;
inline void Sieve(int mx) {
register int i, j;
for (phi[1] = 1, ispr[1] = 1, i = 2; i <= mx; ++i) {
if (!ispr[i]) pr[++tot] = i, sk[tot] = sk[tot - 1] + Pow(i, k), phi[i] = i - 1;
for (j = 1; j <= tot && pr[j] * i <= mx; ++j) {
ispr[i * pr[j]] = 1;
if (i % pr[j]) phi[i * pr[j]] = phi[i] * (pr[j] - 1);
else {
phi[i * pr[j]] = phi[i] * pr[j];
break;
}
}
}
for (i = 1; i <= mx; ++i) sphi[i] = sphi[i - 1] + phi[i];
}
# define ID(x) ((x) <= d ? id1[x] : id2[n / (x)])
inline uint Sum(uint x) {
register uint i, j, v = 0, t, r, tmp = k <= x ? k : x;
for (i = 1; i <= tmp; ++i) {
t = i + 1, r = s[k][i];
for (j = x - i + 1; j <= x + 1; ++j)
if (t > 1 && j % t == 0) r *= j / t, t = 1;
else r = r * j;
v += r;
}
return v;
}
uint Sumphi(uint x) {
if (x <= d) return sphi[x];
if (sp[ID(x)]) return sp[ID(x)];
register uint ans = (x & 1) ? ((x + 1) >> 1) * x : (x >> 1) * (x + 1), i, j;
for (i = 2; i <= x; i = j + 1) j = x / (x / i), ans -= Sumphi(x / i) * (j - i + 1);
return sp[ID(x)] = ans;
}
int main() {
register uint i, j, e, ans = 0, lst = 0, cur, r, v, tmp, now;
scanf("%u%d", &n, &k), Sieve(d = sqrt(n));
for (i = 1; i <= 50; ++i)
for (s[i][1] = 1, j = 2; j <= i; ++j)
s[i][j] = s[i - 1][j] * j + s[i - 1][j - 1];
for (i = 1; i <= n; i = j + 1) {
val[++cnt] = n / i, j = n / (n / i);
val[cnt] <= d ? id1[val[cnt]] = cnt : id2[n / val[cnt]] = cnt;
f[cnt] = val[cnt] - 1, g[cnt] = Sum(val[cnt]) - 1;
}
for (i = 1; i <= tot && pr[i] * pr[i] <= n; ++i)
for (j = 1; j <= cnt && pr[i] * pr[i] <= val[j]; ++j) {
f[j] -= f[ID(val[j] / pr[i])] - i + 1;
g[j] -= (sk[i] - sk[i - 1]) * (g[ID(val[j] / pr[i])] - sk[i - 1]);
}
for (i = 1; i <= cnt; ++i) s1[i] = f[i], s2[i] = g[i];
for (r = 1; r <= tot && pr[r] * pr[r] <= n; ++r);
for (i = r - 1; i; --i)
for (tmp = sk[i] - sk[i - 1], j = 1; j <= cnt && pr[i] * pr[i] <= val[j]; ++j)
for (cur = e = 1, v = pr[i]; v <= val[j] / pr[i]; ++e, v *= pr[i], cur *= tmp)
now = (s2[ID(val[j] / v)] - sk[i] + tmp) * cur, s1[j] += now, s2[j] += tmp * now;
for (i = 1; i <= n; i = j + 1) {
j = n / (n / i), cur = s1[ID(j)];
ans += (cur - lst) * (Sumphi(n / i) * 2 - 1), lst = cur;
}
printf("%u\n", ans);
return 0;
}
51NOD1847:奇怪的数学题的更多相关文章
- [51nod1847]奇怪的数学题
description 51nod 求\[\sum_{i=1}^{n}\sum_{j=1}^{n}sgcd(i,j)^k\]其中\(sgcd(i,j)\)表示\(i,j\)的次大公约数,如果\(gcd ...
- 51nod1847 奇怪的数学题 (Min_25筛+第二类斯特林数)
link \(\sum_{i=1}^n\sum_{j=1}^n\mathrm{sgcd}(i,j)^k=\sum_{p=1}^ns(p)^k\sum_{i=1}^n\sum_{j=1}^n[\gcd( ...
- 【51NOD 1847】奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数)
[51NOD 1847]奇怪的数学题(莫比乌斯反演,杜教筛,min_25筛,第二类斯特林数) 题面 51NOD \[\sum_{i=1}^n\sum_{j=1}^nsgcd(i,j)^k\] 其中\( ...
- [51nod 1847]奇怪的数学题
[ 51nod 1847 ]奇怪的数学题 题目 点这里看题目. 分析 是挺奇怪的...... 以下定义质数集合为\(P\),\(p_i\)为第\(i\)个质数. 定义\(mp(x)\) ...
- 【51NOD1847】奇怪的数学题 min_25筛
题目描述 记\(sgcd(i,j)\)为\(i,j\)的次大公约数. 给你\(n\),求 \[ \sum_{i=1}^n\sum_{j=1}^n{sgcd(i,j)}^k \] 对\(2^{32}\) ...
- 【51nod1847】 奇怪的数学题
就当我是 A 了此题吧... 首先预备知识有点多(因为题目要处理的东西都挺毒瘤): 杜教筛运用(当然你可以用其他筛?) 第二类斯特林数相关定理 下降阶乘幂相关定理 min25 筛运用 好了可以关掉本题 ...
- 【51Nod1847】奇怪的数学题
记\(f(x)=\)\(x\)的次大因数,那么\(sgcd(i,j)=f(gcd(i,j))\). 下面来推式子: \[ \begin{aligned} \sum_{i=1}^n\sum_{j=1 ...
- 【51nod1847】奇怪的数学题(Min_25筛+杜教筛)
题面 传送门 题解 这题有毒--不知为啥的错误调了半天-- 令\(f(i)={sgcd(i)}\),那么容易看出\(f(i)\)就是\(i\)的次大质因子,用\(i\)除以它的最小质因子即可计算 于是 ...
- 【51nod 1847】奇怪的数学题
题目描述 给出 N,K ,请计算下面这个式子: \(∑_{i=1}^N∑_{j=1}^Nsgcd(i,j)^k\) 其中,sgcd(i, j)表示(i, j)的所有公约数中第二大的,特殊地,如果gcd ...
随机推荐
- C语言奇淫技巧,字符串的三种表示方法,不会用不是合格的程序员
1.在C语言中,是将字符串作为字符数组来处理的,字符串是逐个存放到数组元素中的 例如用一个一维的字符数组存放字符串"I am a boy.",如下代码: char c[12] = ...
- 对drf视图集的理解
视图集ViewSet 使用视图集ViewSet,可以将一系列逻辑相关的动作放到一个类中: list() 提供一组数据 retrieve() 提供单个数据 create() 创建数据 update() ...
- L02-RHEL6.5环境中安装JDK1.8
注: 1.本文安装的是jdk1.8,采用rpm包的方式安装. 2.rpm安装方式默认会把jdk安装到/usr/java/jdk1.8xxx 路径上,若想将JDK安装到特定路径,需以源码方式安装,可参考 ...
- CSS01--概述与选择器
CSS:Cascading Style Sheets,层叠样式表.我们之前已经说过,HTML解决的是网页内容(结构)的问题,而CSS立足于网页的表现方面的问题,则样式定义如何显示HTML标签,js负责 ...
- 使用sqlyog将sql server 迁移到mysql
使用软件工具sqlyog(64位) sqlyog 迁移步骤 1.使用sqlyog连接目标数据库 连接目标数据库 2.选择目标数据库(需要先把表结构建好,从SQL Server同步表结构也可以使用工具, ...
- Could not parse UiSelector argument: 'XXX' is not a string 错误解决办法
ebDriverWait(driver,20).until(EC.visibility_of_element_located((MobileBy.ANDROID_UIAUTOMATOR,new UiS ...
- LOJ3069. 「2019 集训队互测 Day 1」整点计数(min_25筛)
题目链接 https://loj.ac/problem/3069 题解 复数真神奇. 一句话题意:令 \(f(x)\) 表示以原点 \((0, 0)\) 为圆心,半径为 \(x\) 的圆上的整点数量, ...
- Mac服务管理-Launchd(转)
背景: 在Mac下没有像Linux那样有很多的关于init方面的工具,从init的发展历史https://en.wikipedia.org/wiki/Init上可以知道,Mac使用的是Launchd作 ...
- 【Sonarqube】windows下更改Temp文件夹的位置
下载的最新Sonarqube版本(4.5.1),通过StartSonar.bat文件可以启动,但是无法通过StartNTService.bat文件启动,原因为默认的Temp文件不可写入, java.l ...
- hadoop-2.6.0-cdh5.4.5.tar.gz(CDH)的3节点集群搭建(含zookeeper集群安装)
前言 本人呕心沥血所写,经过好一段时间反复锤炼和整理修改.感谢所参考的博友们!同时,欢迎前来查阅赏脸的博友们收藏和转载,附上本人的链接 http://www.cnblogs.com/zlslch/p/ ...