这个题和我之前做的一个题相似,但那个题数据太小,暴力就过,这个也就想想,做之前还以为是什么高深的算法,完全没有思路,看够题解才知道,打表,可怕,没什么意思,难道就没有别的好方法么?我是没找到
翻译:
宝拉和泰是情侣。他们之间有很多故事。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;
}