HDU1406
题目链接
注意有坑!
输入的范围不保证前者一定比后者小,注意主动交换成小的在前,大的在后。
//完数
//欧拉筛选
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const int size=123456;
vector<int> arr[size]; //存每个数的因子
vector<int> res; //因子个数
int main(){
int a,b;
int sum,k;
for(int i=2;i<size;i++){
k=2;
while(i*k<size){
arr[i*k].push_back(i);
k++;
}
sum=0;
if(!arr[i].empty()){
for(int j=0;j<arr[i].size();++j){
sum+=arr[i][j];
}
}
if(sum+1==i) res.push_back(i);
}
int n;
while(scanf("%d",&n)!=EOF){
for(int j=0;j<n;j++){
scanf("%d%d",&a,&b);
if(a>b){
a^=b;
b^=a;
a^=b;
}
int cnt=0;
for(int i=0;i<res.size();i++){
if(res[i]>=a&&res[i]<=b)
cnt++;
}
printf("%d\n",cnt);
}
}
return 0;
}
西电考研复试
题目链接
不同之处在于,这道题的范围到达了10的5次方,所以只能考虑欧拉筛选。
//完数
//欧拉筛选
#include<cstdio>
#include<cmath>
#include<vector>
using namespace std;
const int size=123456;
vector<int> arr[size]; //存每个数的因子
vector<int> res; //因子个数
int main(){
int a,b;
int sum,k;
for(int i=2;i<size;i++){
k=2;
while(i*k<size){
arr[i*k].push_back(i);
k++;
}
sum=0;
if(!arr[i].empty()){
for(int j=0;j<arr[i].size();++j){
sum+=arr[i][j];
}
}
if(sum+1==i) res.push_back(i);
}
while(scanf("%d%d",&a,&b)!=EOF){
if(a>b){
a^=b;
b^=a;
a^=b;
}
for(int i=0;i<res.size();i++){
if(res[i]>=a&&res[i]<=b)
printf("%d\n",res[i]);
}
}
return 0;
}