BZOJ 3434 Wc2014 时空穿梭 莫比乌斯反演

题目大意:给定一个n维空间,需要在这n维空间内选取c个共线的点,要求这c个点每维坐标均单调递增,第i维坐标是整数且在[1,mi]

为了表述方便令||代表中间东西的方案数 顺便设第i维坐标为ai 但是这样不简洁因此用x表示第1维坐标,y表示第二维坐标,θ表示第n维坐标

貌似我的方法SB了?不管了总之自己能推出来真是太好了- -

尼玛BZOJ渣评测机卡常数- - 明明UOJ5s就全过了的说- -

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
#define MOD 10007
using namespace std;
int mu[M],prime[M],tot;
bool not_prime[M];
int f[M][20],mu_f[M][20],sum[M][20][12];
//f[i][j]表示和为i,长度为j的正整数排列的个数
//mu_f[T][j]表示c-1=j时Σ[i|T]mu[i]F[T/i]的值
//sum[T][j][k]表示c-1=j时T^k*Σ[i|T]mu[i]F[T/i]的前缀和
int n,c,min_m,m[12],a[12];
void Linear_Shaker()
{
	int i,j;
	mu[1]=1;
	for(i=2;i<=100000;i++)
	{
		if(!not_prime[i])
		{
			prime[++tot]=i;
			mu[i]=-1;
		}
		for(j=1;prime[j]*i<=100000;j++)
		{
			not_prime[prime[j]*i]=1;
			if(i%prime[j]==0)
			{
				mu[prime[j]*i]=0;
				break;
			}
			mu[prime[j]*i]=-mu[i];
		}
	}
}
void Pretreatment()
{
	int i,j,k;

	Linear_Shaker();

	for(i=1;i<=100000;i++)
	{
		f[i][1]=1;
		for(j=2;j<=i&&j<=19;j++)
			f[i][j]=(f[i-1][j]+f[i-1][j-1])%MOD;
	}

	for(i=1;i<=100000;i++)
		for(j=1;j<=19;j++)
			for(k=100000/i;k;k--)
				(mu_f[k*i][j]+=mu[i]*f[k][j])%=MOD;

	for(i=1;i<=100000;i++)
		for(j=1;j<=19;j++)
		{
			int temp=1;
			for(k=0;k<=11;k++,temp*=i,temp%=MOD)
				(sum[i][j][k]=sum[i-1][j][k]+mu_f[i][j]*temp%MOD)%=MOD;
		}
}
void Get_A(int lower)
{
	int i,j;
	memset(a,0,sizeof a);
	a[0]=1;
	for(i=1;i<=n;i++)
	{
		int d=m[i]/lower;
		int k=-((long long)d*(d+1)>>1)%MOD;
		int b=((long long)m[i]*d)%MOD;
		for(j=n;j;j--)
			(a[j]=k*a[j-1]+b*a[j])%=MOD;
		(a[0]*=b)%=MOD;
	}
}
int main()
{
	int T,i,j,last;
	Pretreatment();
	for(cin>>T;T;T--)
	{
		scanf("%d%d",&n,&c);
		min_m=0x3f3f3f3f;
		for(i=1;i<=n;i++)
		{
			scanf("%d",&m[i]);
			min_m=min(min_m,m[i]);
		}
		int ans=0;
		for(i=1;i<=min_m;i=last+1)
		{
			last=0x3f3f3f3f;
			for(j=1;j<=n;j++)
				last=min(last,m[j]/(m[j]/i) );
			Get_A(i);
			for(j=0;j<=n;j++)
				(ans+=a[j]*(sum[last][c-1][j]-sum[i-1][c-1][j])%MOD)%=MOD;
		}
		printf("%d\n",(ans+MOD)%MOD);
	}
	return 0;
}
时间: 2024-10-13 17:48:10

BZOJ 3434 Wc2014 时空穿梭 莫比乌斯反演的相关文章

【BZOJ】3434: [Wc2014]时空穿梭

http://www.lydsy.com/JudgeOnline/problem.php?id=3434 题意:n维坐标中要找c个点使得c个点在一条线上且每一维的坐标单调递增且不能超过每一维限定的值m[i](n<=11, 2<=c<=20, m[i]<=100000) #include <bits/stdc++.h> using namespace std; const int N=100005, MD=10007; int C[N][19], g[21][N], f[

BZOJ 1114 Number theory(莫比乌斯反演+预处理)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=71738 题意:给你一个整数序列a1, a2, a3, ... , an.求gcd(ai, aj) = 1 且 i < j的对数. 思路:利用莫比乌斯反演很快就能得到公式,但是求解时我们要知道序列中1, 2, 3, ... , max(a1, a2, ... , an)的倍数各是多少.我们用num[i]=k,来表示序列中有k个数是i的倍数,那么这部分对结果的影响是m

BZOJ 2301 Problem b(莫比乌斯反演+分块优化)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=37166 题意:对于给出的n个询问,每次求有多少个数对(x,y),满足a≤x≤b,c≤y≤d,且gcd(x,y) = k,gcd(x,y)函数为x和y的最大公约数. 思路:本题使用莫比乌斯反演要利用分块来优化,那么每次询问的复杂度降为2*sqrt(n)+2*sqrt(m).注意到 n/i ,在连续的k区间内存在,n/i=n/(i+k).所有对这连续的区间可以一次求出

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

BZOJ3434 [Wc2014]时空穿梭

摔电脑摔电脑!JZP业界毒瘤! 400题纪念~哇终于上400了的说!!!好不容易欸! 题解什么的还是Orz iwtwiioi 我求组合数的方法明明是O(n)的,为什么这么慢!!!令人报警! 喂,话说这题的重点不在求组合数上面吧... 1 /************************************************************** 2 Problem: 3434 3 User: rausen 4 Language: C++ 5 Result: Accepted 6

BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】

2820: YY的GCD Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1624  Solved: 853[Submit][Status][Discuss] Description 神犇YY虐完数论后给傻×kAc出了一题给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对kAc这种 傻×必然不会了,于是向你来请教……多组输入 Input 第一行一个整数T 表述数据组数接下来T行,每行两个正

BZOJ 4176 Lucas的数论 莫比乌斯反演

题目大意:给定n(n≤109),求∑ni=1∑nj=1d(ij) 推错式子害死人... 由d|ij等价于dgcd(i,d)|j可得 ∑ni=1∑nj=1d(ij) =∑ni=1∑n2d=1?n?gcd(i,d)d? =∑nd=1∑?nd?i=1∑?n2d?j=1?nj?[gcd(i,j)=1] =∑nd=1∑?nd?i=1∑nj=1?nj?[gcd(i,j)=1] =∑nd=1∑?nd?i=1∑nj=1?nj?∑k|i,k|jμ(k) =∑nk=1μ(k)(∑?nk?d=1?nkd?)2 O(n

bzoj 2820 YY的GCD 莫比乌斯反演

题目大意: 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 这里就抄一下别人的推断过程了 后面这个g(x) 算的方法就是在线性筛的时候只考虑当前的数最小因子,如果进来的最小因子不存在,相当于在之前那个数的基础上的每个mu值都多加了一个质数,那么 这些mu值就要取反,如果已经包含了这个最小因子,我这里另外进行了跟之前类似的讨论方法,在代码中写着 因为这题目数据比较大,这里求解的时候不应该线性求,因为总是有一段区间的n/i*(m/i)值

BZOJ 1101 [POI2007]Zap(莫比乌斯反演)

[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1101 [题目大意] 求[1,n][1,m]内gcd=k的情况 [题解] 考虑求[1,n][1,m]里gcd=k 等价于[1,n/k][1,m/k]里gcd=1 考虑求[1,n][1,m]里gcd=1 结果为sum(miu[d]*(n/d)*(m/d)) 预处理O(n^1.5) 由于n/d只有sqrt(n)种取值,所以可以预处理出miu[]的前缀和 询问时分段求和 [代码] #incl