Format
Input
给你一个数字t,代表有t组询问
每组询问给你一个数字x,请输出x的约数个数及约数之和
t<=1e6
x<=1e7
Output
输出t行,含义如上
Samples
输入数据 1
3
1
100
120
Copy
输出数据 1
1 1
9 217
16 360
思路
这道题是一道利用欧拉筛的题。
代码见下:
#include<bits/stdc++.h>
using namespace std;
bool f[10000001];
int n,m,kk,dc,s,c,z[10000001];
int main(){
scanf("%d",&c);
for(int ij=1;ij<=c;ij++){
scanf("%d",&n);
kk=1;
dc=1;
z[1]=1;
m=n;
for(int i=2;i<=sqrt(m);i++){
while(m%i==0){
m/=i;
s=dc;
for(int j=1;j<=s;j++){
if(f[z[j]*i]==0){
kk=kk+z[j]*i;
z[++dc]=z[j]*i;
f[z[dc]]=1;
}
}
}
}
if(m>1){
s=dc;
for(int j=1;j<=s;j++){
if(f[z[j]*m]==0){
kk=kk+z[j]*m;
z[++dc]=z[j]*m;
f[z[dc]]=1;
}
}
}
for(int i=1;i<=dc;i++){
f[z[i]]=0;
}
printf("%d %d\n",dc,kk);
}
return 0;
}