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