【bzoj3601】一个人的数论 莫比乌斯反演+高斯消元
题目描述
.jpg)
题解
莫比乌斯反演+高斯消元
(前方高能:所有题目中给出的幂次d,公式里为了防止混淆,均使用了k代替)



#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll mod = 1000000007;
ll a[110][110] , p[1010] , v[1010];
ll pow(ll x , ll y)
{
ll ans = 1;
while(y)
{
if(y & 1) ans = ans * x % mod;
x = x * x % mod , y >>= 1;
}
return ans;
}
int main()
{
int d , w , i , j , k;
ll t , ans = 0;
scanf("%d%d" , &d , &w);
for(i = 1 ; i <= w ; i ++ ) scanf("%lld%lld" , &p[i] , &v[i]);
if(w == 1 && p[1] == 1)
{
puts("1");
return 0;
}
for(i = 1 ; i <= d + 1 ; i ++ )
{
a[i][0] = 1;
for(j = 1 ; j <= d + 1 ; j ++ ) a[i][j] = a[i][j - 1] * i % mod;
a[i][d + 2] = (a[i - 1][d + 2] + a[i][d]) % mod;
}
for(i = 1 ; i <= d + 1 ; i ++ )
{
for(j = i ; j <= d + 1 ; j ++ ) if(a[i][j]) break;
if(j > d + 1) continue;
for(k = i ; k <= d + 2 ; k ++ ) swap(a[i][k] , a[j][k]);
t = pow(a[i][i] , mod - 2);
for(j = i ; j <= d + 2 ; j ++ ) a[i][j] = a[i][j] * t % mod;
for(j = 1 ; j <= d + 1 ; j ++ )
if(j != i)
for(t = a[j][i] , k = i ; k <= d + 2 ; k ++ )
a[j][k] = (a[j][k] - a[i][k] * t % mod + mod) % mod;
}
for(i = 1 ; i <= d + 1 ; i ++ )
{
t = 1;
for(j = 1 ; j <= w ; j ++ )
t = t * pow(pow(p[j] , v[j]) , i) % mod * (1 - pow(p[j] , (d - i + mod - 1) % (mod - 1)) + mod) % mod;
ans = (ans + a[i][d + 2] * t) % mod;
}
printf("%lld\n" , 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}^ ...
- BZOJ 3601 一个人的数论 ——莫比乌斯反演 高斯消元
http://www.cnblogs.com/jianglangcaijin/p/4033399.html ——lych_cys 我还是太菜了,考虑一个函数的值得时候,首先考虑是否积性函数,不行的话就 ...
- BZOJ3601 一个人的数论 莫比乌斯反演、高斯消元/拉格朗日插值
传送门 题面图片真是大到离谱-- 题目要求的是 \(\begin{align*}\sum\limits_{i=1}^N i^d[gcd(i,n) == 1] &= \sum\limits_{i ...
- 【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 ...
- LOJ 2542 「PKUWC2018」随机游走 ——树上高斯消元(期望DP)+最值反演+fmt
题目:https://loj.ac/problem/2542 可以最值反演.注意 min 不是独立地算从根走到每个点的最小值,在点集里取 min ,而是整体来看,“从根开始走到点集中的任意一个点就停下 ...
- BZOJ-1013 球形空间产生器sphere 高斯消元+数论推公式
1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec Memory Limit: 162 MB Submit: 3662 Solved: 1910 [Subm ...
随机推荐
- python读取文件指定行
import linecache file=open('3_2.txt','r') linecount=len(file.readlines()) linecache.getline('3_2.txt ...
- SQL查询出每门课都大于80 分的学生姓名
Course表如下: 查询出每门课都大于80 分的学生姓名有两种方法. 1.select distinct name from Course where name not in (select di ...
- java 实现猜数字游戏 随机给定一个数字,猜大小直到正确
package com.swift; import java.util.Random; import java.util.Scanner; public class GuessBigSmall { p ...
- display :inline-block 处理点小障碍
使用inline-block之前先处理点小障碍:inline-block元素会有4px左右的空隙,这个是因为我们写代码时候的换行符所致. 解决办法很简单:在inline-block的父元素中设置样式f ...
- HDU 2045 LELE的RPG难题
递推 枚举起点状态 #include <algorithm> #include <iostream> #include <cstring> #include < ...
- 八、Linux 用户和用户组管理
Linux 用户和用户组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统. 用户的账号一方面可以帮助 ...
- linux正则表达式企业级深度实践案例2
[root@redhat~]# sed -nr ' s#([ ^ : ]+) (: .* :) (/.*$)#\3\2\1#gp ' /etc/passwd
- ZendFramework-2.4 源代码 - 关于配置
$applicationConfig = $serviceManager->setService('ApplicationConfig'); // 获取配置 /data/www/www.doma ...
- day 63 Django基础九之中间件
Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学 ...
- 常见的js算法面试题收集,es6实现
1.js 统计一个字符串出现频率最高的字母/数字 let str = 'asdfghjklaqwertyuiopiaia'; const strChar = str => { let strin ...