【枚举约数】HackerRank - Week of Code 26 - Satisfactory Pairs

题意:给你一个正整数n,问你存在多少个正整数对a,b(a<b),满足条件:存在正整数x,y,使得ax+by=n。

就预处理出n以内所有数的约数,然后暴力枚举a,暴力枚举x,然后枚举n-ax的所有约数,判重,统计答案即可。

#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
typedef vector<int>::iterator ITER;
vector<int>divisors[300010];
int n,used[300010],ans;
bool cmp(const int &a,const int &b)
{
	return a>b;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;++i)
	  {
	  	for(int j=1;j*j<=i;++j)
	  	  if(i%j==0)
	  		{
	  	      divisors[i].push_back(j);
	  	      if(j*j!=i)
	  	      	divisors[i].push_back(i/j);
	  	  	}
	  	sort(divisors[i].begin(),divisors[i].end(),cmp);
	  }
	for(int a=1;a<n;++a)//枚举a
	  for(int x=1;x*a<n;++x)//枚举x
		{
		  int yb=n-x*a;
		  for(ITER it=divisors[yb].begin();it!=divisors[yb].end();++it)//*it 就是b
		    {
		      if((*it)<=a)//因为b>a
		        break;
		      if(used[*it]!=a)//防止重复统计
		        {
		          ++ans;
		          used[*it]=a;
		        }
		    }
		}
	printf("%d\n",ans);
	return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/6295388.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值