SP1772题解

考虑把矩阵消成上三角然后求对角线的值。

可以发现每一行只会消掉自己的倍数行,且系数为 \(1\)

假设第 \(n\)\(n\) 列的元素是 \(f[n]\),有:

\[f[n]=n^k-\sum_{d\mid n,d\ne n}f[d] \]

\[f * 1=id^k \]

\[f=id^k * \mu \]

考虑每个质数幂处的这玩意儿是好算的,而且是考虑答案的乘积,所以理所当然地计算每个质数幂对答案的贡献。

能够发现有 \(\lfloor\frac{n}{p^k}\rfloor-\lfloor\frac{n}{p^{k+1}}\rfloor\) 个数包含了 \(p^k\)。所以答案是:

\[\prod_{p^k\leq n}(p^{Kk}-p^{K(k-1)})^{\lfloor\frac{n}{p^k}\rfloor-\lfloor\frac{n}{p^{k+1}}\rfloor} \]

\[\prod_{p^k\leq n}(p^{K(k-1)}(p^K-1))^{\lfloor\frac{n}{p^k}\rfloor-\lfloor\frac{n}{p^{k+1}}\rfloor} \]

\[\prod_{p^k\leq n,2\leq k}\frac{p^{K(k-1)}(p^K-1)}{p^{K(k-2)}(p^K-1)}^{\lfloor\frac{n}{p^k}\rfloor}\prod_{p\leq n}(p^K-1)^{\lfloor\frac{n}{p}\rfloor} \]

\[\prod_{p^k\leq n,2\leq k}{p^K}^{\lfloor\frac{n}{p^k}\rfloor}\prod_{p\leq n}(p^K-1)^{\lfloor\frac{n}{p}\rfloor} \]

\[\prod_{p\leq n}p^{K\sum_{k=2}\lfloor\frac{n}{p^k}\rfloor}(p^K-1)^{\lfloor\frac{n}{p}\rfloor} \]

直接计算即可做到单次询问 \(O(n)\)

#include<cstdio>
const int M=1e6+5,mod=1e6+3,MOD=mod-1;
int T,m,n[25],k[25];int top,pos[M],pri[M];
struct Barrett{
	double inv;
	Barrett(const int&m=2):inv(1./m+1e-15){}
	friend inline int operator/(const int&a,const Barrett&mod){
		return int(a*mod.inv);
	}
}F[M];
inline int g(const int&n,const int&p){
	return n+(n<p?0:g(n/F[p],p));
}
inline int pow(int a,int b=mod-2){
	int ans(1);for(;b;b>>=1,a=1ll*a*a%mod)if(b&1)ans=1ll*ans*a%mod;return ans;
}
inline void sieve(const int&n){
	for(int i=2;i<=n;++i){
		if(!pos[i])pri[pos[i]=++top]=i,F[i]=Barrett(i);for(int x,j=1;j<=pos[i]&&(x=i*pri[j])<=n;++j)pos[x]=j;
	}
}
inline int calc(const int&n,const int&K){
	int ans(1);
	for(int i=1;i<=top&&pri[i]<=n;++i){
		const int&P=pri[i],&N=n/F[P];ans=1ll*ans*pow(P,1ll*K*g(N/F[P],P)%MOD)%mod*pow(pow(P,K)-1,N)%mod;
	}
	return ans;
}
signed main(){
	scanf("%d",&T);for(int i=1;i<=T;++i)scanf("%d%d",n+i,k+i),n[i]>m&&(m=n[i]);
	sieve(m);for(int i=1;i<=T;++i)printf("%d\n",calc(n[i],k[i]%MOD));
}
posted @ 2022-07-08 18:45  Prean  阅读(23)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};