社区讨论
过样例0pts求条
P6222「P6156 简单题」加强版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mjzr8ssi
- 此快照首次捕获于
- 2026/01/04 21:15 2 个月前
- 此快照最后确认于
- 2026/01/05 17:32 上个月
CPP
#include<bits/stdc++.h>
using namespace std;
#define uint int
int n,k,t;
const int N=1e7+5;
uint pw(uint x,int k){
uint ans=1;
while(k){
if(k&1)ans=ans*x;
k>>=1,x=x*x;
}
return ans;
}
uint f[2*N],g[2*N];
uint s[N];
int pri[N],cnt;
void F(int n){
f[1]=1,g[1]=1;
for(int i=2;i<=n;i++){
if(!g[i]){
g[i]=pw(i,k);
pri[++cnt]=i,f[i]=i-1;
}
for(int j=1;j<=cnt;j++){
if(pri[j]>n/i)break;
g[i*pri[j]]=g[i]*g[pri[j]];
if(i%pri[j]){
f[i*pri[j]]=f[i]*f[pri[j]];
}
else{
if((i/pri[j])%pri[j]){
if(i!=pri[j])f[i*pri[j]]=f[i/pri[j]]*f[pri[j]*pri[j]];
else f[i*i]=-i;
}
else{
f[i*pri[j]]=0;
}
break;
}
}
}
for(int i=2;i<=n;i++)f[i]=f[i]*g[i],f[i]+=f[i-1],g[i]+=g[i-1];
}
void S(int n){
for(int i=1;i<=n;i++){
s[i]=s[i-1]+g[2*i]-g[i]+g[2*i-1]-g[i];
}
}
void sol(){
cin>>n;
int l=1,r;
uint ans=0;
for(;l<=n;){
r=n/(n/l);
ans+=(f[r]-f[l-1])*s[n/l];
l=r+1;
}cout<<ans<<'\n';
}
int main(){
cin>>t>>n>>k;
F(2*n);S(n);
while(t--)sol();
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...