辽宁2010省赛 Friends number

这个题和我之前做的一个题相似,但那个题数据太小,暴力就过,这个也就想想,做之前还以为是什么高深的算法,完全没有思路,看够题解才知道,打表,可怕,没什么意思,难道就没有别的好方法么?我是没找到

翻译:

宝拉和泰是情侣。他们之间有很多故事。Paula乘飞机离开的那天,Tai发来一条消息给2200284电话,然后,一切都在变化......(“雪之女王”中的故事)。

经过很长一段时间,Tai告诉Paula,220和284是几个朋友的数字,因为它们很特殊,220的总和的所有除数是284,所有284的总和的除数是220.你能发现有怎样的许多朋友的夫妻数量不到10,000。然后,如何约100,000,200,000等。

你的任务是找出在给定的闭区间[a,b]中有多少对朋友的数量。

翻译给了,提议就不说了。。。
 

#include<stdio.h>
#include<queue>
#include<math.h>
#include<time.h>
#include<string.h>
#include<vector>
#include<algorithm>
#include<iostream>
#include<set>
#include<map>
#include<stack>
#define LL long long
#define mem(a,b) memset(a,b,sizeof(a))
#define lowbit(a) a&(-a)
#define PI acos(-1)
#define shortime(a)  std::ios::sync_with_stdio(a);
using  namespace std;
//const LL mod=1e9+7;
//long long cmp(node a,node b){ if(a.x==b.x) return a.r>b.r;return a.x>b.x;}
LL  quick(LL x,LL n,LL mod){ LL ans=1,temp=x; while(n){if(n%2==1){ ans=(ans*temp)%mod;} n/=2;temp=temp*temp%mod;}return ans%mod;}
int maxn (int a,int b,int c){return max(max(a,b),max(b,c));}
LL min(LL a,LL b) {return a<b?a:b;}
int gcd (int a,int b){return b==0?a:gcd(b,a%b);}
int a[5000005];
int main()
{
	int sum[100][3],num=0,i,j;
	memset(a,0,sizeof a);
	for(i=1;i<=500000;i++)
	{
		for(j=2;i*j<=500000;j++)
		{
			a[i*j]+=i;
		}
	}
	for(i=1;i<=500000;i++)
	{
		if(i==a[a[i]]&&i!=a[i])
		{
			if(i>a[i])
				continue;
			sum[num][0]=i;
			sum[num][1]=a[i];
            num++;
		}
	}
	int x,y;
	while(~scanf("%d%d",&x,&y))
    {
        int cum=0;
        for(int i=0;i<num;i++)
        {
            if(x<=sum[i][0]&&x<=sum[i][1]&&y>=sum[i][0]&&y>=sum[i][1])
                 cum++;
        }
        printf("%d\n",cum);
    }
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值