题目链接:https://www.luogu.com.cn/problem/P4464

简记$gcd(x,y)=(x,y)$。

推式子:

$\sum_{i=1}^{n}{(i,n)^xlcm(i,n)^y}$

$=\sum_{i=1}^{n}{(i,n)^{x-y}(in)^y}$

$=n^y\sum_{d|n}d^{x-y}\sum_{i}i^y[(i,n)=d]$

$=n^y\sum_{d|n}{d^{x-y}\sum_{i=1}^{\frac{n}{d}}{(id)^y[(i,\frac{n}{d})=1]}}$

$=n^y\sum_{d|n}{d^x\sum_{i=1}^{\frac{n}{d}}{i^y[(i,\frac{n}{d})=1]}}$

$=n^y\sum_{d|n}{d^x\sum_{i=1}^{\frac{n}{d}}{i^y\sum_{k|(i,\frac{n}{d})}{\mu(k)}}}$

改变最后的求和式的顺序,注意k的取值要整除$\frac{n}{d}$。

$=n^y\sum_{d|n}{d^x\sum_{k|\frac{n}{d}}{\mu(k)}\sum_{i=1}^{\frac{n}{dk}}{(ik)^y}}$

$=n^y\sum_{d|n}{d^x\sum_{k|\frac{n}{d}}{\mu(k)k^y}\sum_{i=1}^{\frac{n}{dk}}{i^y}}$

若我们把最后的和式看成是一个y+1次的多项式,它的第i项系数为$t_i$,那么

$=n^y\sum_{j=1}^{y+1}{t_i}\sum_{d|n}{d^x\sum_{k|\frac{n}{d}}{\mu(k)k^y}(\frac{n}{dk})^j}$

(注意最后一项的变化)

注意到后面所有的形式都是积性函数的卷积,因此我们尝试一个质数的若干次方的贡献,最后将其相乘就得到某一个对应的j的答案。

于是对于固定的$d=p^q,n=p^w$,最后一个和式的贡献为$(p^{w-q})^j-p^y(p^{w-q-1})^j$(分别考虑$d=1$和$d=p$)。特别地,若$d=n$,那么贡献为1。如果我们能快速得到所有$t_i$,那么就能在$O(n^{0.25}logn+ylog^3n)$的复杂度完成一次询问。

考虑如何得到$t_i$。一种方法是使用插值,这里讨论使用伯努利数的方法(应用,证明看https://www.luogu.com.cn/blog/chihik/bo-nu-li-shu)。

递归定义:$\sum_{i=0}^{n}{\tbinom{n+1}{i}B_i=[n=0]}$

令$S_m(n)=\sum_{i=0}^{n-1}{i^m}$,那么$S_m(n)=\frac{1}{m+1}\sum_{i=0}^{m}{\tbinom{m+1}{i}B_in^{m+1-i}}$

于是对于上面的y+1次多项式,有$S_y(\frac{n}{dk})=\sum_{i=0}^{\frac{n}{dk}-1}{i^y}=\frac{1}{y+1}\sum_{i=0}^{y}{\tbinom{y+1}{i}{B_i(\frac{n}{dk})^{y+1-i}}}$,所以$t_{y+1-i}=\frac{1}{y+1}\tbinom{y+1}{i}B_i$。(它的零次项系数为0!(这是感叹号,不是阶乘))

但我们注意到少了一项$(\frac{n}{dk})^y$,因此$t_y$需要增加1(对应了$i=1$)。

  1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long int ll;
4 typedef long double ld;
5 namespace MATH
6 {
7 inline ll mul(ll x,ll y,ll mod)
8 {
9 return ((x*y-(ll)((ld)x*y/mod)*mod)%mod+mod)%mod;
10 }
11 inline ll qpow(ll x,ll y,ll mod)
12 {
13 ll ans=1,base=x;
14 while(y)
15 {
16 if(y&1)
17 ans=mul(ans,base,mod);
18 base=mul(base,base,mod);
19 y>>=1;
20 }
21 return ans;
22 }
23 const int prime[10]={2,3,5,7,11,13,17,19,23,29};
24 const int LEN=10;
25 inline bool miller(ll x)
26 {
27 for(int i=0;i<LEN;++i)
28 {
29 if(x<prime[i])
30 return false;
31 else if(x==prime[i])
32 return true;
33 ll now=x-1,y=qpow(prime[i],x-1,x);
34 if(y!=1)
35 return false;
36 while(now%2==0&&y==1)
37 {
38 now>>=1;
39 y=qpow(prime[i],now,x);
40 if(y!=1&&y!=x-1)
41 return false;
42 }
43 }
44 return true;
45 }
46 ll gcd(ll x,ll y)
47 {
48 return x%y==0?y:gcd(y,x%y);
49 }
50 inline ll f(ll x,ll y,ll mod)
51 {
52 return (mul(x,x,mod)+y)%mod;
53 }
54 inline ll get(ll n,ll c,int steps)
55 {
56 if(!(n&1))
57 return 2;
58 ll x=2,y=2,d=1;
59 while(true)
60 {
61 ll tmpx=x,tmpy=y;
62 for(int i=1;i<=steps;++i)
63 {
64 x=f(x,c,n);
65 y=f(y,c,n);
66 y=f(y,c,n);
67 d=mul(d,((y-x)%n+n)%n,n);
68 }
69 d=gcd(d,n);
70 if(d==1)
71 continue;
72 if(d!=n)
73 return d;
74 x=tmpx,y=tmpy;
75 for(int i=1;i<=steps;++i)
76 {
77 x=f(x,c,n);
78 y=f(y,c,n);
79 y=f(y,c,n);
80 d=gcd(((y-x)%n+n)%n,n);
81 if(d!=1&&d!=n)
82 return d;
83 }
84 return 0;
85 }
86 }
87 vector<ll>wait;
88 void pollard(ll n)
89 {
90 if(miller(n))
91 {
92 wait.push_back(n);
93 return;
94 }
95 ll now=0,c=1,g=pow(n,0.1)+1;
96 while(!now)
97 now=get(n,++c,g);
98 pollard(now),pollard(n/now);
99 }
100 }
101 const ll mod=1000000007;
102 ll C[3005][3005],B[3005];
103 inline ll qpow(ll x,ll y)
104 {
105 ll ans=1,base=x%mod;
106 while(y)
107 {
108 if(y&1)
109 ans=ans*base%mod;
110 base=base*base%mod;
111 y>>=1;
112 }
113 return ans;
114 }
115 inline void init()
116 {
117 for(int i=0;i<=3004;++i)
118 {
119 C[i][0]=1;
120 for(int j=1;j<=i;++j)
121 C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
122 }
123 B[0]=1;
124 for(int i=1;i<=3002;++i)
125 {
126 for(int j=0;j<i;++j)
127 B[i]=(B[i]+B[j]*C[i+1][j])%mod;
128 B[i]=(B[i]*qpow(-i-1,mod-2)%mod+mod)%mod;
129 }
130 }
131 ll tmp[3005];
132 inline void solve()
133 {
134 ll n,x,y;
135 cin>>n>>x>>y;
136 MATH::wait.clear();
137 MATH::pollard(n);
138 vector<ll>wait=MATH::wait;
139 map<ll,int>vis;
140 for(ll x:wait)
141 ++vis[x];
142 ll ans=0;
143 for(int i=0;i<=y;++i)
144 tmp[y+1-i]=C[y+1][i]*B[i]%mod*qpow(y+1,mod-2)%mod;
145 tmp[y]+=1;
146 for(int i=1;i<=y+1;++i)
147 {
148 ll s=1;
149 for(auto A:vis)
150 {
151 ll p=A.first,k=A.second;
152 ll g=0;
153 ll now=1,delta=qpow(p,x);
154 ll G=qpow(p,y);
155 for(int j=0;j<k;++j,now=now*delta%mod)
156 g=(g+now*(qpow(qpow(p,k-j),i)-G*qpow(qpow(p,k-j-1),i)%mod)%mod)%mod;
157 g=(g+now%mod)%mod;
158 s=s*g%mod;
159 }
160 ans=(ans+tmp[i]*s)%mod;
161 }
162 ans=ans*qpow(n%mod,y)%mod;
163 ans=(ans%mod+mod)%mod;
164 cout<<ans<<endl;
165 }
166 int main()
167 {
168 ios::sync_with_stdio(false);
169 init();
170 int T;
171 cin>>T;
172 while(T--)
173 solve();
174 return 0;
175 }

luogu4464:莫比乌斯反演,积性函数和伯努利数的更多相关文章

  1. BZOJ 2693: jzptab 莫比乌斯反演 + 积性函数 +筛法

    Code: #include<bits/stdc++.h> #define ll long long #define M 10001000 #define maxn 10200100 #d ...

  2. BZOJ 2694: Lcm 莫比乌斯反演 + 积性函数 + 线性筛 + 卡常

    求 $\sum_{i=1}^{n}\sum_{j=1}^{m}lcm(i,j)\mu(gcd(i,j))^2$   $\Rightarrow \sum_{d=1}^{n}\mu(d)^2\sum_{i ...

  3. bzoj2693--莫比乌斯反演+积性函数线性筛

    推导: 设d=gcd(i,j) 利用莫比乌斯函数的性质 令sum(x,y)=(x*(x+1)/2)*(y*(y+1)/2) 令T=d*t 设f(T)= T可以分块.又由于μ是积性函数,积性函数的约束和 ...

  4. 莫比乌斯反演/线性筛/积性函数/杜教筛/min25筛 学习笔记

    最近重新系统地学了下这几个知识点,以前没发现他们的联系,这次总结一下. 莫比乌斯反演入门:https://blog.csdn.net/litble/article/details/72804050 线 ...

  5. P6222 「简单题」加强版 莫比乌斯反演 线性筛积性函数

    LINK:简单题 以前写过弱化版的 不过那个实现过于垃圾 少预处理了一个东西. 这里写一个实现比较精细了. 最后可推出式子:\(\sum_{T=1}^nsum(\frac{n}{T})\sum_{x| ...

  6. Mobius反演与积性函数前缀和演学习笔记 BZOJ 4176 Lucas的数论 SDOI 2015 约数个数和

    下文中所有讨论都在数论函数范围内开展. 数论函数指的是定义域为正整数域, 且值域为复数域的函数. 数论意义下的和式处理技巧 因子 \[ \sum_{d | n} a_d = \sum_{d | n} ...

  7. 积性函数&线性筛&欧拉函数&莫比乌斯函数&因数个数&约数个数和

    只会搬运YL巨巨的博客 积性函数 定义 积性函数:对于任意互质的整数a和b有性质f(ab)=f(a)f(b)的数论函数. 完全积性函数:对于任意整数a和b有性质f(ab)=f(a)f(b)的数论函数 ...

  8. bzoj 4407 于神之怒加强版 —— 反演+筛积性函数

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4407 推导如这里:https://www.cnblogs.com/clrs97/p/5191 ...

  9. bzoj 2693: jzptab 线性筛积性函数

    2693: jzptab Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 444  Solved: 174[Submit][Status][Discus ...

随机推荐

  1. docker(4)解决pull镜像速度缓慢

    前言 上一篇讲到pull 镜像,但是pull镜像的时候下拉的速度实在感人,有什么解决办法吗?我们只需将docker镜像源修改为国内的 将docker镜像源修改为国内的: 在 /etc/docker/d ...

  2. 在Android用vulkan完成蓝绿幕扣像

    效果图(1080P处理) 因为摄像头开启自动曝光,画面变动时,亮度变化导致扣像在转动时如上. 源码地址vulkan_extratest 这个demo主要测试二点,一是测试ndk camera集成效果, ...

  3. BZOJ3238 [Ahoi2013]差异 【SAM or SA】

    BZOJ3238 [Ahoi2013]差异 给定一个串,问其任意两个后缀的最长公共前缀长度的和 1.又是后缀,又是\(lcp\),很显然直接拿\(SA\)的\(height\)数组搞就好了,配合一下单 ...

  4. poj3661 Running

    Description The cows are trying to become better athletes, so Bessie is running on a track for exact ...

  5. CodeCraft-20 (Div. 2) C. Primitive Primes (数学)

    题意:给你两个一元多项式\(f(x)\)和\(g(x)\),保证它们每一项的系数互质,让\(f(x)\)和\(g(x)\)相乘得到\(h(x)\),问\(h(x)\)是否有某一项系数不被\(p\)整除 ...

  6. 【史上最全】Hadoop 核心 - HDFS 分布式文件系统详解(上万字建议收藏)

    1. HDFS概述 Hadoop 分布式系统框架中,首要的基础功能就是文件系统,在 Hadoop 中使用 FileSystem 这个抽象类来表示我们的文件系统,这个抽象类下面有很多子实现类,究竟使用哪 ...

  7. Selenium刚玩一会儿,就感受了私人秘书的体验

    学习python的过程中,少不了接触第三方库,毕竟作为胶水语言python的强大之处也就是第三方库体量庞大,无疑大大增强了python的战斗力. 有时候想完成网页自动化操作,这时候Selenium进入 ...

  8. word2vector代码实践

    引子 在上次的 <word2vector论文笔记>中大致介绍了两种词向量训练方法的原理及优劣,这篇咱们以skip-gram算法为例来代码实践一把. 当前教程参考:A Word2Vec Ke ...

  9. Redis 持久化(Persistence)

    作为内存数据库,Redis 依然提供了持久化机制,其主要目的有两个: 安全:保证进程崩溃后数据不会丢失 备份:方便数据迁移与快速恢复 Redis 同时提供两种持久化机制: RDB 快照:数据库在某个时 ...

  10. Leetcode(105)-从前序与中序遍历序列构造二叉树

    根据一棵树的前序遍历与中序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15, ...