辽宁省赛2010 G题 Friends Number


题目链接:http://acm.neu.edu.cn/hustoj/problem.php?id=1008

题意:数a和数b,若a的因子和(不包括a)为bb的因子和为a,则ab为满足条件的一对。给定一个区间,求这个区间内有多少对这样的数。

思路:打表。比赛的时候莫名其妙的没有做出来,大概是优化的时候把因子和大于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;

}

 

你可能感兴趣的:(辽宁省赛2010 G题 Friends Number)