题面

传送门

思路

这题妙啊

先把式子摆出来

$f_n(d)=\sum_{i=1}n[gcd(i,n)==1]id$

这个$gcd$看着碍眼,我们把它反演掉

$f_n(d)=\sum_{i=1}n\sum_{j|i,j|n}\mu(j)id=\sum_{j|n}\mu(j)\sum_{i=1}{\frac{n}{j}}(ij)d=\sum_{j|n}\mu(j)jd\sum_{i=1}{\frac{n}{j}}i^d$

那么最后面这个东西就是个自然数幂求和了

在这篇关于斯特林数的blog最后,我给出了自然数幂求和转斯特林数的公式:

$xn=\sum_{i=1}n \begin{Bmatrix} n\\i \end{Bmatrix} \frac{x!}{(x-i)!}$

我们对左边的$x$,取$1...m$求和,得到$\sum_{i=1}^m in=\sum_{j=1}m \sum_{i=1}^j \begin{Bmatrix} j\\i \end{Bmatrix} \frac{j!}{(j-i)!}$

由此可得,右边这个东西显然是一个关于$i$(也就是原来那个式子里面的$x$)的,在$1...n+1$项上有系数的多项式

(其实还有另外一个公式:$Sum_k(n)=\sum_{i=1}^n ik=\sum_{j=1}k\begin{Bmatrix}k\\j\end{Bmatrix}\frac{{(n+1)}^\underline{j+1}}{j+1}$)

(好像这个简单易懂一点= =)

不管怎么样,我们可以设$\sum_{i=1}^x i^d =\sum_{i=1}^{d+1}c_i x^i$

然后我们对于$x=1...d+1$分别求出$c_i$那一项的系数,我们实际上得到了一个$d+1$元线性方程组

可以高斯消元之,得到$c$数组

再把$c$放进式子里面,得到:

$f_n(d)=\sum_{j|n}\mu(j)jd\sum_{i=1}{d+1}c_i(\frac{n}{j})i=\sum_{i=1}{d+1} c_i \sum_{j|n}\mu(j)j^d (\frac{n}{j})^i$

显然后面那个$\sum$里面的一坨东西是个积性函数(因为是两个积性函数的狄利克雷卷积)对吧

我们设$H(i)=\sum_{j|i}\mu(j)j^d (\frac{n}{j})i$,那么$H(n)=\prod_{i=1}w H(p_i^{a_i})$

代回原式:

$f_n(d)=\sum_{i=1}^{d+1} c_i \prod_{j=1}^w H(p_j{a_j})=\sum_{i=1}^{d+1} c_i \prod_{j=1}^w \sum_{k|p_j{a_j}}\mu(k)kd(\frac{p_j{a_j}}{k})i$

后面这个式子,显然当且仅当$k=1$和$k=p_j$的时候有值(因为其他时候$\mu(k)=0$),那么把这个两项代入,可以得到:

$f_n(d)=\sum_{i+1}^{d+1} c_i \prod_{j=1}^w (p_j^{a_j\ast i}-p_j^{d+a_j\ast i -i})$

那么就解决了,总复杂度是$O(d^3+dw)$

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cassert>
#include<cmath>
#define ll long long
#define MOD 1000000007
using namespace std;
inline ll read(){
ll re=0,flag=1;char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-') flag=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
return re*flag;
}
ll d,w,p[1010],a[1010],c[110][110],x[110];
ll qpow(ll a,ll b){
ll re=1;
while(b){
if(b&1) re=re*a%MOD;
a=a*a%MOD;b>>=1;
}
return re;
}
void Gauss(){
ll i,j,k,num;ll tmp,tt;
for(i=1;i<=d+1;i++){
num=i;
for(j=i+1;j<=d+1;j++) if(abs(c[j][i])>abs(c[num][i])) num=j;
for(j=1;j<=d+2;j++) swap(c[i][j],c[num][j]);
tmp=qpow(c[i][i],MOD-2);
for(j=i+1;j<=d+1;j++){
tt=c[j][i]*tmp%MOD;
for(k=1;k<=d+2;k++) c[j][k]=(c[j][k]-tt*c[i][k]%MOD+MOD)%MOD;
}
}
for(i=d+1;i>=1;i--){
x[i]=c[i][d+2]=c[i][d+2]*qpow(c[i][i],MOD-2)%MOD;
for(j=i-1;j>=1;j--) c[j][d+2]=(c[j][d+2]-c[j][i]*c[i][d+2]%MOD+MOD)%MOD;
}
}
int main(){
d=read();w=read();ll i,j,tmp,sum=0;
for(i=1;i<=w;i++) p[i]=read(),a[i]=read();
for(i=1;i<=d+1;i++){
tmp=1;sum+=qpow(i,d);sum%=MOD;
for(j=1;j<=d+1;j++){
tmp=tmp*i%MOD;
c[i][j]=tmp;
}
c[i][d+2]=sum;
}
Gauss();tmp=0;
for(i=1;i<=d+1;i++){
sum=1;
for(j=1;j<=w;j++) sum*=(qpow(p[j],a[j]*i)-qpow(p[j],d+a[j]*i-i)+MOD),sum%=MOD;
tmp=(tmp+x[i]*sum)%MOD;
}
printf("%lld\n",tmp);
}

[bzoj3601] 一个人的数论 [莫比乌斯反演+高斯消元]的更多相关文章

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

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

  2. BZOJ 3601 一个人的数论 ——莫比乌斯反演 高斯消元

    http://www.cnblogs.com/jianglangcaijin/p/4033399.html ——lych_cys 我还是太菜了,考虑一个函数的值得时候,首先考虑是否积性函数,不行的话就 ...

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

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

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

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

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

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

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

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

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

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

  8. LOJ 2542 「PKUWC2018」随机游走 ——树上高斯消元(期望DP)+最值反演+fmt

    题目:https://loj.ac/problem/2542 可以最值反演.注意 min 不是独立地算从根走到每个点的最小值,在点集里取 min ,而是整体来看,“从根开始走到点集中的任意一个点就停下 ...

  9. BZOJ-1013 球形空间产生器sphere 高斯消元+数论推公式

    1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3662 Solved: 1910 [Subm ...

随机推荐

  1. v-for的显示过滤/排序结果

    对于v-for列表渲染指令,项目中很常用的额,但是我们一般可能在从后端接口拿到数据的时候就把数据通过循环整理改造成自己想要的样子了.有时候可能对于不同的列表需求,还要在data里多造一份数据. 这种做 ...

  2. 关于Ubuntu 16.04 pip安装Docker-Compose

    $ sudo apt-get update 安装pip: $ sudo apt-get install python-pip 卸载旧版本docker-compose: $ sudo pip unins ...

  3. Java反射+注解案例

    注解类代码,注解的属性可以有多个: package reflect; import java.lang.annotation.Retention; import java.lang.annotatio ...

  4. 侯捷《C++面向对象开发》——动手实现自己的复数类

    前言 最近在看侯捷的一套课程<C++面向对象开发>,刚看完第一节introduction之后就被疯狂圈粉.感觉侯捷所提及所重视的部分也正是我一知半解的知识盲区,我之前也写过一些C++面向对 ...

  5. redis安装与简单使用

    第一步 新建一个文件 第二步 利用winscrp软件从本机上传redis的压缩包到linux新建的rdtar目录 第三步   cd rdtar 第四步   解压  tar zxvf redis-2+t ...

  6. 谈一谈如何远程访问MySQL(腾讯云,云主机)

    连接MySQL (其他的sql 基本相同套路) 腾讯云不管怎么设置端口和MySQL权限以及监听端口就是不能连接? 远程访问MySQL数据库的几个关键点 端口设置 数据库权限设置 数据库的监听端口设置 ...

  7. 英文缩写SFR

    英文缩写为SFR,是Special Function Register(特殊功能寄存器)的缩写.

  8. Eclipse字体修改

    第一步: 第二步: 第三步: 第四步: 第五步: 第六步:

  9. compileReleaseJavaWithJavac

    如果你打release 包的时候,出现这个问题,那么请你先跑一下程序,肯定是有什么方法名,或者什么东西没找到. release 的时候不会报错,只有你跑的时候才会报错.

  10. 局域网&广域网&Internet&计算机通信过程

    1.局域网 覆盖范围小(100m以内),自己花钱购买,自己单位来维护,带宽固定的(10M,100M,1000M) 2.Internet ISP,有自己的机房,对网民提供访问Internet连接 3.广 ...