题目链接:http://acm.neu.edu.cn/hustoj/problem.php?id=1008
题意:数a和数b,若a的因子和(不包括a)为b,b的因子和为a,则a和b为满足条件的一对。给定一个区间,求这个区间内有多少对这样的数。
思路:打表。比赛的时候莫名其妙的没有做出来,大概是优化的时候把因子和大于MAXN时因子和赋值为-1,遍历出错。比赛的时候用了两个标记分别从前往后和从后往前遍历也是挺无聊的~
发现对二维数组,不一定要用{{a,b},{c,d}}来赋值,{a,b,c,d}的效果一样。
代码:
#include <stdio.h>
#include <math.h>
#include <string.h>
//int const MAXN = 5000000+5;
//int sum[MAXN];
//int visit[MAXN];
//void cal()
//{
// memset(visit,0,sizeof(visit));
// memset(sum,0,sizeof(sum));
// int i,j;
// int t;
// i=1;
// sum[1] = 0;
// for(i=1; i<MAXN; i++){
// j = 2*i;
// while(j<MAXN){
// sum[j] += i;
//// if(j==469028)
//// printf("%d %d\n",i,sum[j]);
// j+=i;
// }
// }
//// printf("sum = %d\n",sum[10]);
//
//// for(i=1; i<50; i++)
//// printf("%d\n",sum[i]);
//}
//int main()
//{
// freopen("data.txt","w",stdout);
// cal();
//// if(sum[486178]==sum[469028])
//// printf("ok\n");
// for(int i=1; i<MAXN; i++){
// int t = sum[i];
// if(t>=MAXN)
// continue;
// if(sum[t]==i && t!=i && visit[t]==0 && visit[i]==0){
// printf("{%d,%d},",i,t);
// visit[t]=1;
// visit[i]=1;
// }
// }
//// printf("\n%d %d\n",sum[2803580],sum[3716164]);
// return 0;
//}
int s[500][2] = {220,284,1184,1210,2620,2924,5020,5564,6232,6368,10744,10856,12285,14595,17296,18416,63020,76084,66928,66992,67095,71145,69615,87633,79750,88730,100485,124155,122265,139815,122368,123152,141664,153176,142310,168730,171856,176336,176272,180848,185368,203432,196724,202444,280540,365084,308620,389924,319550,430402,356408,399592,437456,455344,469028,486178,503056,514736,522405,525915,600392,669688,609928,686072,624184,691256,635624,712216,643336,652664,667964,783556,726104,796696,802725,863835,879712,901424,898216,980984,947835,1125765,998104,1043096,1077890,1099390,1154450,1189150,1156870,1292570,1175265,1438983,1185376,1286744,1280565,1340235,1328470,1483850,1358595,1486845,1392368,1464592,1466150,1747930,1468324,1749212,1511930,1598470,1669910,2062570,1798875,1870245,2082464,2090656,2236570,2429030,2652728,2941672,2723792,2874064,2728726,3077354,2739704,2928136,2802416,2947216,2803580,3716164,3276856,3721544,3606850,3892670,3786904,4300136,3805264,4006736,4238984,4314616,4246130,4488910,4259750,4445050,0};
int main()
{
int a,b;
int num;
for(int i=0; i<500; i++)
if(s[i][0]>s[i][1]){
int temp = s[i][0];
s[i][0] = s[i][1];
s[i][1] = temp;
}
while(scanf("%d%d",&a,&b)!=EOF){
int i = 0;
int ans = 0;
for(i=0; i<1000 ; i++){
if(s[i][0]==0)
break;
if(s[i][0]>=a && s[i][1]<=b){
ans ++;
}
}
printf("%d\n",ans);
}
return 0;
}