BZOJ3601 一个人的数论 莫比乌斯反演、高斯消元/拉格朗日插值
题面图片真是大到离谱……
题目要求的是
\(\begin{align*}\sum\limits_{i=1}^N i^d[gcd(i,n) == 1] &= \sum\limits_{i=1}^N i^d \sum\limits_{p \mid gcd(i,n)} \mu(p) \\ &= \sum\limits_{p|n} \mu(p) p^d \sum\limits_{i=1}^{\frac{n}{p}} i^d\end{align*}\)
然后就不会做了qwq,后面的自然数次幂和似乎和前面的\(\mu(p)p^d\)没什么关系
注意到\(f(x) = \sum\limits_{i=1}^x i^d\)可以写成一个\(d+1\)次多项式,即\(f(x) = \sum\limits_{i=0}^{d+1} a_ix^i\),将这个代入上面的式子
\(\begin{align*}\sum\limits_{p|n} \mu(p) p^d \sum\limits_{i=1}^{\frac{n}{p}} i^d &= \sum\limits_{p|n} \mu(p) p^d \sum\limits_{i=0}^{d+1} a_i(\frac{n}{p})^i \\ &= \sum\limits_{i=0}^{d+1} a_i n^i \sum\limits_{p \mid n} \mu(p)p^{d-i} \end{align*}\)
\(\mu(p)p^{d-i}\)是积性函数,\(\mu(p)\)又需要保证\(p\)中每一个质因数的指数只能为\(1\),给出\(n\)的方式又是质因数分解之后的方式,所以可以比较方便地计算所有质数的贡献。
所以唯一的问题就是如何求出\(a_i\)。这个高斯消元和拉格朗日插值都可以。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
//This code is written by Itst
using namespace std;
const int MAXN = 1007 , MOD = 1e9 + 7;
int N , D , W , prm[MAXN] , e[MAXN] , gauss[107][107];
inline int poww(long long a , int b){
int times = 1;
if(b < 0) b += MOD - 1;
while(b){
if(b & 1) times = times * a % MOD;
a = a * a % MOD;
b >>= 1;
}
return times;
}
void init(){
int sum = 0;
for(int i = 0 ; i <= D + 1 ; ++i){
int cur = 1;
sum = (sum + poww(i , D)) % MOD;
for(int j = 0 ; j <= D + 1 ; ++j){
gauss[i][j] = cur;
cur = 1ll * cur * i % MOD;
}
gauss[i][D + 2] = sum;
}
for(int i = 0 ; i <= D + 1 ; ++i){
int j = i;
while(j <= D + 1 && !gauss[j][i])
++j;
swap(gauss[i] , gauss[j]);
int inv = poww(gauss[i][i] , MOD - 2);
for(int k = i ; k <= D + 2 ; ++k)
gauss[i][k] = 1ll * gauss[i][k] * inv % MOD;
while(++j <= D + 1)
if(gauss[j][i])
for(int k = D + 2 ; k >= i ; --k)
gauss[j][k] = (gauss[j][k] - 1ll * gauss[i][k] * gauss[j][i] % MOD + MOD) % MOD;
}
for(int i = D + 1 ; i >= 0 ; --i)
for(int j = i - 1 ; j >= 0 ; --j)
gauss[j][D + 2] = (gauss[j][D + 2] - 1ll * gauss[j][i] * gauss[i][D + 2] % MOD + MOD) % MOD;
}
int main(){
#ifndef ONLINE_JUDGE
//freopen("in","r",stdin);
//freopen("out","w",stdout);
#endif
cin >> D >> W;
N = 1;
for(int i = 1 ; i <= W ; ++i){
cin >> prm[i] >> e[i];
N = 1ll * N * poww(prm[i] , e[i]) % MOD;
}
init();
int ans = 0;
for(int i = 0 ; i <= D + 1 ; ++i){
int sum = 1;
for(int j = 1 ; j <= W ; ++j)
sum = 1ll * sum * (1 - poww(prm[j] , D - i) + MOD) % MOD;
ans = (ans + 1ll * sum * poww(N , i) % MOD * gauss[i][D + 2]) % MOD;
}
cout << ans;
return 0;
}
BZOJ3601 一个人的数论 莫比乌斯反演、高斯消元/拉格朗日插值的更多相关文章
- [bzoj3601] 一个人的数论 [莫比乌斯反演+高斯消元]
题面 传送门 思路 这题妙啊 先把式子摆出来 $f_n(d)=\sum_{i=1}^n[gcd(i,n)==1]i^d$ 这个$gcd$看着碍眼,我们把它反演掉 $f_n(d)=\sum_{i=1}^ ...
- 【bzoj3601】一个人的数论 莫比乌斯反演+高斯消元
题目描述 题解 莫比乌斯反演+高斯消元 (前方高能:所有题目中给出的幂次d,公式里为了防止混淆,均使用了k代替) #include <cstdio> #include <cstrin ...
- BZOJ 3601 一个人的数论 ——莫比乌斯反演 高斯消元
http://www.cnblogs.com/jianglangcaijin/p/4033399.html ——lych_cys 我还是太菜了,考虑一个函数的值得时候,首先考虑是否积性函数,不行的话就 ...
- 【XSY3309】Dreamweaver 高斯消元 拉格朗日插值
题目大意 这是一道通信题. 给你 \(8\) 个 \(32\) 位整数.加密端要把这些数加密成至少 \(1000\) 个 \(32\) 位整数,交互库会把这些整数随机打乱后发给解密端,解密端最多能获得 ...
- EOJ Monthly 2019.11 E. 数学题(莫比乌斯反演+杜教筛+拉格朗日插值)
传送门 题意: 统计\(k\)元组个数\((a_1,a_2,\cdots,a_n),1\leq a_i\leq n\)使得\(gcd(a_1,a_2,\cdots,a_k,n)=1\). 定义\(f( ...
- 【BZOJ3601】一个人的数论 高斯消元+莫比乌斯反演
[BZOJ3601]一个人的数论 题解:本题的做法还是很神的~ 那么g(n)如何求呢?显然它的常数项=0,我们可以用待定系数法,将n=1...d+1的情况代入式子中解方程,有d+1个方程和d+1个未知 ...
- 【bzoj3601】一个人的数论 莫比乌斯反演+莫比乌斯函数性质+高斯消元
Description Sol 这题好难啊QAQ 反正不看题解我对自然数幂求和那里是一点思路都没有qwq 先推出一个可做一点的式子: \(f(n)=\sum_{k=1}^{n}[(n,k)=1]k^d ...
- BZOJ3601 一个人的数论 【数论 + 高斯消元】
题目链接 BZOJ3601 题解 挺神的 首先有 \[ \begin{aligned} f(n) &= \sum\limits_{x = 1}^{n} x^{d} [(x,n) = 1] \\ ...
- BZOJ3601. 一个人的数论(狄利克雷卷积+高斯消元)及关于「前 $n$ 个正整数的 $k$ 次幂之和是关于 $n$ 的 $k+1$ 次多项式」的证明
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3601 题解 首先还是基本的推式子: \[\begin{aligned}f_d(n) &a ...
随机推荐
- Future FutrueTask Callable类源码说明以及原理使用
1.Future Callable FutureTask 源码说明 JDK内置的Future主要使用到了Callable接口和FutureTask类. Callable是类似于Runnable的接口, ...
- Javascript 流程控制
流程控制 JavaScript通过流程语句来执行程序流,程序流有若干语句组成.在正常情况下,程序中 的语句时按照书写顺序执行的,这种结构称为顺序结构.除了顺序结构之外还有选择结构和循环结构. 1.选择 ...
- 「破解」Xposed强
「破解」Xposed强 Hook Hook Hook! 两张图片,第一张是我的微信截图,第二张是我从微信Hook出的一些类名. 一段代码,Hook这些类名出来的源码. 知道这些我们能干嘛,当然是分析( ...
- LeetCode题解之 Assign Cookies
1.题目描述 2.问题分析 使用贪心算法. 3 代码 class Solution { public: int findContentChildren(vector<int>& g ...
- 华为ENSP进行evn实验,尚不完整,但已经有RT1、RT2、RT3、RT4了
组网R1 -- CE12800 -- CE12800 --- R2 其中R1.R2是模拟VM的 R1的配置: interface GigabitEthernet0/0/0#interface Gig ...
- SQL SERVER中LIKE使用变量类型不同输出结果不一致解惑
一同事在写脚本时,遇到一个关于LIKE里面使用不同的变量类型导致查询结果不一致的问题,因为这个问题被不同的人问过好几次,索性总结一下,免得每次都要解释一遍,直接丢一篇博客岂不是更方便!其实看似有点让人 ...
- 洗礼灵魂,修炼python(89)-- 知识拾遗篇 —— 进程
进程 1.含义:计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位.说白了就是一个程序的执行实例. 执行一个程序就是一个进程,比如你打开浏览器看到我的博客,浏览器本身是一 ...
- Postgresql的隐藏系统列
转自 https://www.2cto.com/database/201206/137301.html Postgresql的隐藏系统列 和oracle数据库一样,postgresql也有自身 ...
- AngularJS学习之旅—AngularJS 简介(一)
一.AngularJS 简介 1.AngularJS 是一个 JavaScript 框架. AngularJS 是一个 JavaScript 框架.它是一个以 JavaScript 编写的库.Angu ...
- timeout 命令
命令简介 运行指定的命令,如果在指定时间后仍在运行,则杀死该进程.用来控制程序运行的时间. 使用方法 1 2 3 timeout [选项] 数字[后缀] 命令 [参数]... 后缀 s 代表秒(默认值 ...