Solution -「LOJ #6053」简单的函数
\(\mathcal{Description}\)
Link.
积性函数 \(f\) 满足 \(f(p^c)=p\oplus c~(p\in\mathbb P,c\in\mathbb N_+)\),求 \(\sum_{i=1}^n f(i)\bmod(10^9+7)\)。
\(\mathcal{Solution}\)
首先,考虑 \(f\) 的素数点值:
3,&p=2\\
p-1,&\text{otherwise}
\end{cases}
\]
由 \(p-1\) 联想到 \(\varphi(p)=p-1\),可惜 \(\varphi(2)=1\)。干脆一点,我们直接强行把 \(\varphi\) 的偶数点值乘上 \(3\),令
\varphi(n),&2\not\mid n\\
3\varphi(n),&\text{otherwise}
\end{cases}
\]
显然它也是积性函数。
接着,求 \(g\) 的前缀和。其前缀和为 \(\varphi\) 的前缀和加上两倍偶数点的 \(\varphi\) 前缀和。记
S(n)&=\sum_{i=1}^n\varphi(2i)\\
&=\sum_{i=1}^n[2\not\mid i]\varphi(i)+2\sum_{i=1}^n[2\mid i]\varphi(i)\\
&=S\left(\frac{n}{2}\right)+\sum_{i=1}^n\varphi(i)
\end{aligned}
\]
杜教筛处理 \(\varphi\) 的前缀,\(S\) 就能在可观(我不会算 qwq)的复杂度内预处理出来,继而也得到了 \(g\) 的 \(\mathcal O(\sqrt n)\) 个前缀和。
此外,我们还需要求 \(h(i)\),即求 \(h(p^c)~(c>1)\)。考虑 \(f(p^c)\) 与它的关系:
\Rightarrow~~~~h(p^c)=f(p^c)-\sum_{i=0}^{c-1}h(p^i)g(p^{c-i})
\]
顺手把 \(\mathcal O(\sqrt n\ln\ln\sqrt n)\)(\(n\) 以内素数的倒数和的规模是 \(\mathcal O(\ln\ln n)\))个 \(h(p^c)\) 也预处理出来,最后 \(\mathcal O(\sqrt n)\) 搜索 Powerful Number 就能求出答案啦!
\(\mathcal{Code}\)
/* Clearink */
#include <cmath>
#include <cstdio>
#include <vector>
#include <unordered_map>
#define rep( i, l, r ) for ( int i = l, repEnd##i = r; i <= repEnd##i; ++i )
#define per( i, r, l ) for ( int i = r, repEnd##i = l; i >= repEnd##i; --i )
typedef long long LL;
const int MAXS = 1e7, MAXSN = 1e5, MOD = 1e9 + 7, INV2 = 500000004;
int pn, pr[MAXS + 5], phi[MAXS + 5], phis[MAXS + 5];
bool npr[MAXS + 5];
std::vector<int> gpr[MAXSN + 5];
inline int mul( const long long a, const int b ) { return a * b % MOD; }
inline int sub( int a, const int b ) { return ( a -= b ) < 0 ? a + MOD : a; }
inline void subeq( int& a, const int b ) { ( a -= b ) < 0 && ( a += MOD ); }
inline int add( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline void addeq( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD ); }
inline void sieve() {
phi[1] = phis[1] = 1;
rep ( i, 2, MAXS ) {
if ( !npr[i] ) phi[pr[++pn] = i] = i - 1;
for ( int j = 1, t; j <= pn && ( t = i * pr[j] ) <= MAXS; ++j ) {
npr[t] = true;
if ( !( i % pr[j] ) ) { phi[t] = phi[i] * pr[j]; break; }
phi[t] = phi[i] * ( pr[j] - 1 );
}
phis[i] = add( phis[i - 1], phi[i] );
}
}
inline int phiSum( const LL n ) {
static std::unordered_map<LL, int> mem;
if ( n <= MAXS ) return phis[n];
if ( mem.count( n ) ) return mem[n];
int ret = mul( mul( n % MOD, ( n + 1 ) % MOD ), INV2 );
for ( LL l = 2, r; l <= n; l = r + 1 ) {
r = n / ( n / l );
subeq( ret, mul( ( r - l + 1 ) % MOD, phiSum( n / l ) ) );
}
return mem[n] = ret;
}
inline int ephiSum( const LL n ) {
if ( !n ) return 0;
return add( ephiSum( n >> 1 ), phiSum( n ) );
}
LL n;
int sn, sum[MAXSN * 2 + 5];
inline void initInvG() {
rep ( i, 1, pn ) {
if ( 1ll * pr[i] * pr[i] > n ) break;
std::vector<int>& curg( gpr[i] );
curg.push_back( 1 ), curg.push_back( 0 );
LL pwr = 1ll * pr[i] * pr[i];
for ( int j = 2; pwr <= n; ++j, pwr *= pr[i] ) {
int g = pr[i] ^ j;
LL pwc = pr[i];
for ( int k = j - 1; ~k; --k, pwc *= pr[i] ) {
subeq( g,
mul( ( pwc / pr[i] * ( pr[i] ^ 1 ) ) % MOD, curg[k] ) );
}
curg.push_back( g );
}
}
}
inline int powerSum( const int pid, LL x, const int g ) {
if ( !g ) return 0;
int ret = 0, p = pr[pid];
if ( pid == 1 || !( x % pr[pid - 1] ) ) {
addeq( ret, mul( g, x > sn ? sum[n / x] : sum[sn + x] ) );
}
if ( ( x *= p ) > n ) return ret;
if ( ( x *= p ) > n ) return ret;
addeq( ret, powerSum( pid + 1, x / ( 1ll * p * p ), g ) );
for ( int i = 2; x <= n; ++i, x *= p ) {
addeq( ret, powerSum( pid + 1, x, mul( g, gpr[pid][i] ) ) );
}
return ret;
}
int main() {
sieve();
scanf( "%lld", &n ), sn = sqrt( 1. * n );
rep ( i, 1, sn ) sum[i] = add( phiSum( i ), mul( 2, ephiSum( i >> 1 ) ) );
rep ( i, 1, sn ) {
sum[i + sn] = add( phiSum( n / i ), mul( 2, ephiSum( n / i >> 1 ) ) );
}
initInvG();
printf( "%d\n", powerSum( 1, 1, 1 ) );
return 0;
}
Solution -「LOJ #6053」简单的函数的更多相关文章
- Solution -「LOJ #138」「模板」类欧几里得算法
\(\mathcal{Description}\) Link. \(T\) 组询问,每次给出 \(n,a,b,c,k_1,k_2\),求 \[\sum_{x=0}^nx^{k_1}\left\ ...
- Solution -「LOJ #6485」 LJJ 学二项式定理
\(\mathcal{Description}\) Link. 给定 \(n,s,a_0,a_1,a_2,a_3\),求: \[\sum_{i=0}^n\binom{n}is^ia_{i\bm ...
- Solution -「LOJ #6029」「雅礼集训 2017」市场
\(\mathcal{Description}\) Link. 维护序列 \(\lang a_n\rang\),支持 \(q\) 次如下操作: 区间加法: 区间下取整除法: 区间求最小值: 区 ...
- Solution -「LOJ #141」回文子串 ||「模板」双向 PAM
\(\mathcal{Description}\) Link. 给定字符串 \(s\),处理 \(q\) 次操作: 在 \(s\) 前添加字符串: 在 \(s\) 后添加字符串: 求 \(s\ ...
- Solution -「LOJ #150」挑战多项式 ||「模板」多项式全家桶
\(\mathcal{Description}\) Link. 给定 \(n\) 次多项式 \(F(x)\),在模 \(998244353\) 意义下求 \[G(x)\equiv\left\{ ...
- 「LOJ#10051」「一本通 2.3 例 3」Nikitosh 和异或(Trie
题目描述 原题来自:CODECHEF September Challenge 2015 REBXOR 1≤r1<l2≤r2≤N,x⨁yx\bigoplus yx⨁y 表示 ...
- 「LOJ#10056」「一本通 2.3 练习 5」The XOR-longest Path (Trie
#10056. 「一本通 2.3 练习 5」The XOR-longest Path 题目描述 原题来自:POJ 3764 给定一棵 nnn 个点的带权树,求树上最长的异或和路径. 输入格式 第一行一 ...
- Solution -「ARC 104E」Random LIS
\(\mathcal{Description}\) Link. 给定整数序列 \(\{a_n\}\),对于整数序列 \(\{b_n\}\),\(b_i\) 在 \([1,a_i]\) 中等概率 ...
- Solution -「JOISC 2021」「LOJ #3489」饮食区
\(\mathcal{Description}\) Link. 呐--不想概括题意,自己去读叭~ \(\mathcal{Solution}\) 如果仅有 1. 3. 操作,能不能做? ...
随机推荐
- NIO【同步非阻塞io模型】关于 文件io 的总结
1.前言 这一篇随笔是写 NIO 关于文件输入输出的总结 /* 总结: 1.io操作包括 socket io ,file io ; 2.在nio模型,file io使用fileChannel 管道 , ...
- 【Spring专场】「MVC容器」不看源码就带你认识核心流程以及运作原理
前提回顾 之前已经写了很多问斩针对于SpringMVC的的执行原理和核心流程,在此再进行冗余介绍就没有任何意义了,所以我们主要考虑的就是针对于SpringMVC还没但大框架有介绍的相关内容解析分析和说 ...
- Hive UDF,就这
摘要:Hive UDF是什么?有什么用?怎么用?什么原理?本文从UDF使用入手,简要介绍相关源码,UDF从零开始. 本文分享自华为云社区<Hive UDF,就这>,作者:汤忒撒. Hive ...
- How to die?
下次给一个 vector 搞 unique 之前,一定要记得给它排序!!1(少点自以为是) 对一个 set "同时"删除两个数时,一定要注意特判两个数是否重复/重叠. 有两个序列, ...
- Redhat 如何使用yum 源(转)
1.需要把Redhat注册的信息给解决掉 This system is not registered with an entitlement server. You can use subscript ...
- Sentry 开发者贡献指南 - 测试技巧
作为 CI 流程的一部分,我们在 Sentry 运行了多种测试. 本节旨在记录一些 sentry 特定的帮助程序, 并提供有关在构建新功能时应考虑包括哪些类型的测试的指南. 获取设置 验收和 pyth ...
- C# 获取DPI例子
public static float GetDpiX() { System.Windows.Forms.Panel p = new System.Windows.Forms.Panel(); Sys ...
- 【视频解码性能对比】opencv + cuvid + gpu vs. ffmpeg + cpu
视频大小:1168856 字节画面尺寸:480*848帧数:275opencv + cuvid + tesla P4, 解码性能:1426.84 fps ffmpeg 4.0 API + [Intel ...
- java内部类概述和修饰符
1 package face_09; 2 /* 3 * 内部类访问特点: 4 * 1,内部类可以直接访问外部类的成员. 5 * 2,外部类要访问内部类,必须建立内部类的对象. 6 * 7 * 一把用于 ...
- python使用range()函数创建数字列表list
#!/usr/bin/python #coding=utf-8 #好好学习,天天向上 numbers=list(range(1,6)) print(numbers) range指定步长: #!/usr ...