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));
}