zoukankan      html  css  js  c++  java
  • hdu 3816

    题意:
    找出N个不同的正数 (3 <= N <= 18) Ai (1 <= i <= N), 满足:
    输出各个N个取值下的可能的解;
    分析:
    根据 1/(a * b) = 1/a(a + b) + 1/b(a + b) ,可以将一个可能的Ai 拆分成俩个
    所有,由已知的一组当N等于3时的一组解{2,3,6},将其中一个可能的Ai拆分成俩个。
    再由N等于4时的解求出N等于5时的解,以此类推;
    #include<iostream>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    int a[20],mark[400];
    int main()
    {
    	printf("2 3 6\n");
    	a[0]=2;a[1]=3;a[2]=6;
    	int num=3;
    	for(int i=4;i<=18;i++)
    	{
    		memset(mark,0,sizeof(mark));
    		for(int j=0;j<num;j++)
    			mark[a[j]]=1;
    		int flag=0;
    		for(int j=0;j<num ;j++){	
    			for(int k=2;k*k<a[j];k++)
    				if(a[j]%k==0)//a[j]可以拆分成俩个数的乘积
    				{
    					int v=a[j]/k,w=k;
    					int p=v*(v+w),q=w*(v+w);
    					if(q>(i+1)*(i+1) || p>(i+1)*(i+1))continue;
    					if(mark[p]|| mark[q])continue;
    					mark[p]=1;mark[q]=1;mark[a[j]]=0;//将1/a[j]拆分成了1/p + 1/q
    					flag=1;break;//只需将一个拆分,所以找到一个可拆的即可退出
    				}
    			if(flag) break;
    		}
    		num=0;
    		for(int j=2;j<=(i+1)*(i+1);j++)
    			if(mark[j]) a[num++]=j;
    		sort(a,a+num);
    		for(int j=0;j<num-1;j++)
    			printf("%d ",a[j]);
    		printf("%d\n",a[num-1]);
    	}
    	return 0;
    }
    

  • 相关阅读:
    左右布局,中分线可以左右拖动
    ES6
    nodeclub route
    nodeclub models
    mybatis中sql语句查询操作
    mybatis开发dao的方式
    Mybatis框架入门
    Maven
    Android开发-ADT Bundle安装
    人类史一览
  • 原文地址:https://www.cnblogs.com/nanke/p/2226826.html
Copyright © 2011-2022 走看看