题目链接

题意简述

求小于 n 且与 n 互质的数的 k 次方之和。

Sol

要求的东西:

\[\sum_{i=1}^n i^k [gcd(i,n)=1]
\]

枚举 gcd 上个莫比乌斯函数:

\[\sum_{i=1}^n i^k \sum_{d|n,d|i} \mu(d)
\]

交换求和顺序

\[\sum_{d|n} \mu(d) \sum_{i=1}^{\frac{n}{d}} (id)^k
\]

这样就差不多没有办法继续了:

\[\sum_{d|n} \mu(d)*d^k \sum_{i=1}^{\frac{n}{d}} i^k
\]

题目中给出的是 n 的分解式 , 这使得我们往积性函数上想。

发现前面的 \(\mu(d)\) 是积性函数 ,\(d^k\) 是个完全积性函数,那么就只剩下最后那个东西了。

这就是个自然质数幂嘛,它是个关于 \(x=\frac{n}{d}\) 的 \(k+1\)次多项式,这样子我们可以把这个多项式的系数直接高斯消元或着拉格朗日插值给弄出来,假设系数是 \(a_i\) ,那么就是:

\[\sum_{d|n} \mu(d)*d^k \sum_{i=0}^{k+1} a_i\bigg(\frac{n}{d}\bigg)^i
\]

交换个求和顺序就好了:

\[\sum_{i=0}^{k+1}a_i\sum_{d|n} \mu(d)*d^k \bigg(\frac{n}{d}\bigg)^i
\]

后面就是个狄利克雷卷积,它也是个积性函数了,直接计算好 \(n\) 是 \(p^k\) 时的结果乘起来就好了,因为莫比乌斯函数必须是在无平方因子时才不为 \(0\),所以 \(d\) 只有 \(1\) 和 \(p\) 两种取值,直接算就行了。

code:

#include<bits/stdc++.h>
using namespace std;
template<class T>inline void init(T&x){
x=0;char ch=getchar();bool t=0;
for(;ch>'9'||ch<'0';ch=getchar()) if(ch=='-') t=1;
for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch-48);
if(t) x=-x;return;
}
typedef long long ll;
const int mod=1e9+7,phi=mod-1;
template<class T>inline void Inc(T&x,int y){x+=y;if(x>=mod) x-=mod;return;}
template<class T>inline void Dec(T&x,int y){x-=y;if(x < 0 ) x+=mod;return;}
template<class T>inline int fpow(int x,T k){int ret=1;for(;k;k>>=1,x=(ll)x*x%mod)if(k&1) ret=(ll)ret*x%mod;return ret;}
inline int Sum(int x,int y){x+=y;return x>=mod? (x-mod):x;}
inline int Dif(int x,int y){x-=y;return x < 0 ? (x+mod):x;}
const int N=1021;
int d,w;
namespace Lagerange{
int coef[N],Y[N];
typedef vector<int> Poly;
inline Poly Mul(Poly A,Poly B){
Poly Res;int szl=A.size(),szr=B.size();Res.resize(szl+szr-1);
for(int i=0;i<szl;++i) for(int j=0;j<szr;++j) Inc(Res[i+j],(ll)A[i]*B[j]%mod);
return Res;
}
Poly Divide(int l,int r,int I){
if(l==r) {
int len=r-l+1;Poly Res;Res.resize(len+1);
if(l==I) Res[0]=1;
else {int inv=fpow(Dif(I,l),mod-2);Res[0]=(ll)(mod-l)*inv%mod;Res[1]=inv;}
return Res;
}
int mid=l+r>>1;Poly A=Divide(l,mid,I),B=Divide(mid+1,r,I);
return Mul(A,B);
}
inline void Solve(int K){
int LIM=K+2;Y[0]=0;
for(int i=1;i<=LIM;++i) Y[i]=Sum(Y[i-1],fpow(i,K));
for(int i=1;i<=LIM;++i) {
Poly ret=Divide(1,LIM,i);
int sz=ret.size();
for(int j=0;j<sz;++j) Inc(coef[j],(ll)Y[i]*ret[j]%mod);
}
return;
}
}using Lagerange::coef;
int P[N],alpha[N];
inline int Calc(int i){
int ret=1;
for(int j=1;j<=w;++j) ret=(ll)ret*Dif(fpow(P[j],(ll)alpha[j]*i%phi),fpow(P[j],((ll)(alpha[j]-1)*i%phi+d)%phi))%mod;
return ret;
}
int main()
{
init(d),init(w);
Lagerange::Solve(d);
int ans=0;
for(int i=1;i<=w;++i) init(P[i]),init(alpha[i]);
for(int i=0;i<=d+1;++i) Inc(ans,(ll)coef[i]*Calc(i)%mod);
cout<<ans<<endl;
}

【BZOJ3601】一个人的数论的更多相关文章

  1. BZOJ3601 一个人的数论 【数论 + 高斯消元】

    题目链接 BZOJ3601 题解 挺神的 首先有 \[ \begin{aligned} f(n) &= \sum\limits_{x = 1}^{n} x^{d} [(x,n) = 1] \\ ...

  2. BZOJ3601 一个人的数论 莫比乌斯反演、高斯消元/拉格朗日插值

    传送门 题面图片真是大到离谱-- 题目要求的是 \(\begin{align*}\sum\limits_{i=1}^N i^d[gcd(i,n) == 1] &= \sum\limits_{i ...

  3. BZOJ3601 一个人的数论

    Description 定义 \[ f_k(n)=\sum_{\substack{1\leq i\leq n\\gcd(i,n)=1}}i^k \] 给出\(n=\prod_{i=1}^w p_i^{ ...

  4. BZOJ3601. 一个人的数论(狄利克雷卷积+高斯消元)及关于「前 $n$ 个正整数的 $k$ 次幂之和是关于 $n$ 的 $k+1$ 次多项式」的证明

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3601 题解 首先还是基本的推式子: \[\begin{aligned}f_d(n) &a ...

  5. [bzoj3601] 一个人的数论 [莫比乌斯反演+高斯消元]

    题面 传送门 思路 这题妙啊 先把式子摆出来 $f_n(d)=\sum_{i=1}^n[gcd(i,n)==1]i^d$ 这个$gcd$看着碍眼,我们把它反演掉 $f_n(d)=\sum_{i=1}^ ...

  6. 【BZOJ3601】一个人的数论(数论)

    [BZOJ3601]一个人的数论(数论) 题面 BZOJ 怎么这图片这么大啊... 题解 要求的是\(\displaystyle \sum_{i=1}^n [gcd(i,n)=1]i^d\) 然后把\ ...

  7. 【BZOJ3601】一个人的数论 高斯消元+莫比乌斯反演

    [BZOJ3601]一个人的数论 题解:本题的做法还是很神的~ 那么g(n)如何求呢?显然它的常数项=0,我们可以用待定系数法,将n=1...d+1的情况代入式子中解方程,有d+1个方程和d+1个未知 ...

  8. 【bzoj3601】一个人的数论 莫比乌斯反演+莫比乌斯函数性质+高斯消元

    Description Sol 这题好难啊QAQ 反正不看题解我对自然数幂求和那里是一点思路都没有qwq 先推出一个可做一点的式子: \(f(n)=\sum_{k=1}^{n}[(n,k)=1]k^d ...

  9. 【bzoj3601】一个人的数论 莫比乌斯反演+高斯消元

    题目描述 题解 莫比乌斯反演+高斯消元 (前方高能:所有题目中给出的幂次d,公式里为了防止混淆,均使用了k代替) #include <cstdio> #include <cstrin ...

  10. 【bzoj3601】一个人的数论(莫比乌斯反演+拉格朗日插值)

    传送门 题意: 求\[ \sum_{i=1}^{n}i^d[gcd(i,n)=1] \] 思路: 我们对上面的式子进行变换,有: \[ \begin{aligned} &\sum_{i=1}^ ...

随机推荐

  1. Quartz最佳实践

    本文来自对http://www.quartz-scheduler.org/documentation/best-practices.html的翻译. 表示还没用过Quartz,正准备用的,然后在官网上 ...

  2. Vue项目移动端滚动穿透问题

    概述 今天在做 Vue 移动端项目的时候遇到了滚动穿透问题,在网上查资料后,选取了我觉得最好的方法,记录下来供以后开发时参考,相信对其他人也有用. 上层无需滚动 如果上层无需滚动的话,直接屏蔽上层的 ...

  3. Nginx1.8源码包编译安装

    1.下载解压Nginx,为方便管理下载包一般将下载包放在指定目录下 ,即/usr/local/src/下. wget http://nginx.org/download/nginx-1.8.0.tar ...

  4. 测开之路一百四十九:jinja2模板之宏

    jinja2是python的模板引擎, 在写python web使用的过程中,macro可以节省大量的代码 比如上一篇的渲染页面 <!DOCTYPE html><html lang= ...

  5. MySQL5.6版本之后设置DATETIME类型自动更新

    在使用MySQL中datetime格式自动更新特性时,我们应该明确一点,datetime格式设置默认值为当前时间和自动更新时间是从MySQL5.6版本之后开始支持的.此前我们都是使用timestamp ...

  6. Debian系列Linux的隐藏WiFi

    Debian系列Linux共用相同的deb安装包,拥有大量的各种软件,是Linux里面最主要的生态系.包括Ubuntu及其衍生版本如Lubuntu/Mate/Kubuntu等,在ARM上也有很好的支持 ...

  7. CSS——插入形式 基本格式 常见css代码

    常见css代码 无下划线链接 字体颜色   +   左边距 背景颜色 字体.字体颜色.大小 文本对齐方式[取代了<center>]

  8. 命令行模式和Python交互模式的区别

    1.命令行模式: 在Windows开始菜单选择“命令提示符”,就进入到命令行模式,它的提示符类似C:\Users\>: 2.python交互模式 在命令行模式下敲命令python,就看到类似如下 ...

  9. 关于连接池和DBUtils

    1.关于数据库连接池 连接池就是创建和管理一个连接缓冲池的技术,这些连接好被任意线程所使用,数据库连接池负责分配和管理.释放数据库连接,总而言之数据库连接池就是提高对数据库的操作性能. 数据库连接池: ...

  10. [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增)

    [Luogu 5465] [LOJ 6435] [PKUSC2018]星际穿越(倍增) 题面 n个点的图,点i和[l[i],i)的所有点连双向边.每次询问(l,r,x)表示x到[l,r]的所有点的最短 ...