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

题目大意:求Σ[i|n]i^d

围观题解:http://www.cnblogs.com/jianglangcaijin/p/4033399.html

果然我还是太蒻了- -

此外Σ[1<=i<=n]i^m的零次项注定为0- - 所以常数项不用消了- -

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 110
#define MOD 1000000007
using namespace std;
long long d,w;
long long f[M][M],a[M];
long long h[M],ans;
long long Quick_Power(long long x,long long y)
{
	long long re=1;
	(y+=MOD-1)%=(MOD-1);
	while(y)
	{
		if(y&1) (re*=x)%=MOD;
		(x*=x)%=MOD;y>>=1;
	}
	return re;
}
void Gauss_Elimination()
{
	int i,j,k;
	for(i=1;i<=d+1;i++)
	{
		long long temp=i;
		for(j=1;j<=d+1;j++,(temp*=i)%=MOD)
			f[i][j]=temp;
		for(j=1,temp=1;j<=d;j++,(temp*=i)%=MOD);
		(f[i][d+2]=(i?f[i-1][d+2]:0)+temp)%=MOD;
	}
	for(i=1;i<=d+1;i++)
	{
		for(j=i;j<=d+1;j++)
			if(f[j][i])
				break;
		for(k=1;k<=d+2;k++)
			swap(f[i][k],f[j][k]);
		for(j=i+1;j<=d+1;j++)
		{
			long long temp=MOD-f[j][i]*Quick_Power(f[i][i],-1)%MOD;
			for(k=i;k<=d+2;k++)
				(f[j][k]+=f[i][k]*temp)%=MOD;
		}
	}
	for(i=d+2;i;i--)
	{
		for(j=i+1;j<=d+1;j++)
			(f[i][d+2]-=f[i][j]*a[j])%=MOD;
		a[i]=(f[i][d+2]*Quick_Power(f[i][i],-1)%MOD+MOD)%MOD;
	}
	//for(i=1;i<=d+1;i++)
	//	cout<<a[i]<<endl;
}
int main()
{
	int i,j;
	cin>>d>>w;
	Gauss_Elimination();
	for(j=1;j<=d+1;j++)
		h[j]=1;
	for(i=1;i<=w;i++)
	{
		int p,a;
		scanf("%d%d",&p,&a);
		for(j=1;j<=d+1;j++)
			( h[j]*=Quick_Power(p,(long long)a*j)%MOD * (1-Quick_Power(p,d-j)%MOD) % MOD )%=MOD;
	}
	for(j=1;j<=d+1;j++)
		(ans+=a[j]*h[j])%=MOD;
	cout<<(ans%MOD+MOD)%MOD<<endl;
	return 0;
}
时间: 2024-08-25 16:03:53

BZOJ 3601 一个人的数论 莫比乌斯反演+高斯消元的相关文章

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

题目描述 题解 莫比乌斯反演+高斯消元 (前方高能:所有题目中给出的幂次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

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

题面 传送门 思路 这题妙啊 先把式子摆出来 $f_n(d)=\sum_{i=1}^n[gcd(i,n)==1]i^d$ 这个$gcd$看着碍眼,我们把它反演掉 $f_n(d)=\sum_{i=1}^n\sum_{j|i,j|n}\mu(j)i^d=\sum_{j|n}\mu(j)\sum_{i=1}^{\frac{n}{j}}(ij)^d=\sum_{j|n}\mu(j)j^d\sum_{i=1}^{\frac{n}{j}}i^d$ 那么最后面这个东西就是个自然数幂求和了 在这篇关于斯特林数的

【bzoj 4176】 Lucas的数论 莫比乌斯反演(杜教筛)

Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数.他现在长大了,题目也变难了. 求如下表达式的值: 一行一个整数ans,表示答案模1000000007的值. Sample Input 2 Sample Output 8 HINT 对于100%的数据n <= 10^9. 题解: 解锁新技能:杜教筛. 再复习一下: 若$F(n)=\s

【BZOJ 4171】 4171: Rhl的游戏 (高斯消元)

4171: Rhl的游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 74  Solved: 33[Submit][Status][Discuss] Description RHL最近迷上一个小游戏:Flip it.游戏的规则很简单,在一个N*M的格子上,有一些格子是黑色,有一些是白色 .每选择一个格子按一次,格子以及周围边相邻的格子都会翻转颜色(边相邻指至少与该格子有一条公共边的格子 ),黑变白,白变黑.RHL希望把所有格子都变成白色的.不幸

BZOJ 1013 [JSOI2008]球形空间产生器sphere 【高斯消元】

Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. HINT 1<=n<=10 提示:给出两个定义:1. 球心:到球面上任意一点距离都相等的点.2. 距离:设两个n为空间上的点A, B的坐标为(a1, a2, …, an), (b1, b2, …, bn),则AB的距离定义为:dist = sqrt( (a1-b1)^2 +

BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

[题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. 1 2 3 4 5 6 7 8 9 10 11 12 void gauss(){     k=n;     F(i,1,n){         F(j,i+1,n) if (a[j]>a[i]) swap(a[i],a[j]);         if (!a[i]) {k=i-1; break;}         D(j,30,0) if (a[i]>>j & 1){            

bzoj 1013 [JSOI2008]球形空间产生器sphere(高斯消元)

1013: [JSOI2008]球形空间产生器sphere Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3584  Solved: 1863[Submit][Status][Discuss] Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器. Input 第一行是一个整数,n.接

BZOJ 2844 albus就是要第一个出场 高斯消元

题目大意:给定一个n个数的集合S和一个数x,求x在S的2^n个子集从大到小的异或和序列中最早出现的位置 有学长真好不用自己打题目大意了233 首先我们求出线性基 我们会得到一些从大到小排列的数和一堆0 记录0的个数 不考虑0,看前面的数,由于线性基的性质,我们直接贪心从大到小枚举 若当前异或和异或这个值小于Q则取这个数 (注意^不要写成+或者| 本蒟蒻已经因为这个WA了两道题了 然后我们通过每个数取不取可以得到一个01序列 这个序列就是通过异或可以得到的小于Q的数的数量的二进制 比如线性基是8

BZOJ 2844 albus就是要第一个出场 高斯消元+线性基

题目大意:给出一个长度为n的正整数数列A.每次选出A的一个子集进行抑或(空集抑或值为0),这样就得到一个长度为2^n的数列B.将B中元素升序排序.给出一个数字m,求m的B中出现的最小位置. 思路:线性基的性质:假设n个数可以消出k个线性基,那么显然会有2^k个不同的亦或和,n个数相互排列显然会有2^n个.神奇的事情就在于每种亦或和居然是一样多的,也就是都是2^(n - k)个.有了这个解决这个题就简单了,做一下高斯消元来求出线性基.正常的求法不行,因为要保证消元的时候一个位置上只能有一个1. C