整数拆分问题(1)

原创 2017年01月02日 21:48:23


我们一起来看看这个问题,说实话,当时一看到这题的时候我怕了,不过想通后那叫一个爽啊!得意

题意:给你一个N,求满足1/X+1/Y=1/N的X,Y种类数


当你看到这题的时候,你会怎么做呢?

当时我看到第一反应就是先化简,因为1/X这个数肯定是比1小的小数,这个精度问题是个大问题,而且两个小数相加也不会完全等于那个小数。所以,想办法划成整数关系式。

两边同乘XY,得  Y+X=XY/N

转换,得        N=XY/(X+Y)

然后直接求吗?不不不,N是个整数,难道你就能保证右边除出来是整数吗?!

然后,绞尽脑汁,沉思,深呼吸,学下一休哥,忽然想到了!

你可以保证,当两个分数相加要等于一个分数时,两个分数的分母肯定都大于这个分数的分母,也就是X,Y>N

我们可以假设,X=N+u,Y=N+v, 其中u,v肯定都是大于0的整数

然后代入,简化出来,不可思议,N^2=uv

而一个整数N都是可以拆成 N=p1^a1 * p2^a2 *……*pn^an 的形式

此时N拆成两个数相乘的形式的种类个数是(a1+1)*(a2+1)*……*(an+1) 【不细讲了,你可以自己去写几个找找规律】

那么N^2=p1^2a1 * p2^2a2 *……*pn^2an

此时,种类数即为(2a1+1)*(2a2+1)*……*(2an+1)  

这个问题就迎刃而解了,接下来就是求底和幂的事情了。

需要特别注意的是当N<2时,是无法整数拆分的,也就是种类数为0


#include <iostream> 
#include <cmath> 
using namespace std; 
#define MAXI 20 
struct yinshu 
{ 
    int di; 
    int mi; 
}; 
struct Div 
{ 
    int xiangshu; 
    int xdi[MAXI]; 
    int xmi[MAXI]; 
}; 
Div getpN(int m); 
void vout(Div pN); 
yinshu getOne(int yin,int& m); 
int main() 
{ 
    int ncase,n,i; 
    cin>>ncase; 
    Div pN; 
    while(ncase--) 
    { 
        cin>>n; 
        pN=getpN(n); 
        vout(pN); 
    } 
    return 0; 
} 
Div getpN(int m) 
{ 
    int i,j; 
    Div pans; 
    yinshu x; 
    if(m<2) 
    { 
        pans.xdi[0]=1; 
        pans.xmi[0]=0; 
        pans.xiangshu=0; 
        return pans; 
    } 
    int uplimit=(int)sqrt(m*1.0); 
    i=2; 
    j=0; 
    while(i<=uplimit) 
    { 

        if(m%i==0) 
        { 
            x=getOne(i,m); 
            pans.xdi[j]=x.di; 
            pans.xmi[j]=x.mi; 
            j++; 
            uplimit=(int)sqrt(1.0*m); 
        } 
        i++; 
    } 
    if(m>1) 
    { 
        pans.xdi[j]=m; 
        pans.xmi[j]=1; 
        j++; 
    } 
    pans.xiangshu=j; 
    return pans; 
} 
void vout(Div pN) 
{ 
    int i; 
    int ans=1; 
    for(i=0;i<pN.xiangshu;i++) 
    { 
        ans*=(pN.xmi[i]*2+1); 
    } 
    cout<<ans<<endl; 
} 
yinshu getOne(int yin,int& m) 
{ 
    yinshu x; 
    x.di=yin; 
    x.mi=0; 
    while(m%yin==0) 
    { 
        x.mi++; 
        m/=yin; 
    } 
    return x; 
} 



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

正整数拆分问题

  • 2016年01月04日 11:56
  • 433B
  • 下载

一个关于把集合拆分的有意思的小题目(将1到N的连续整数组成的集合划分成两个子集合)

今天上午,本来是老老实实的在敲着自己的代码,然后朋友在群里发了一个小题目,自己看了感觉挺有意思,当时就来了兴趣。想着要写一写。        题目是这样子的:             将1到N的连续整...

Hdu 1028 Ignatius and the Princess III(整数拆分问题,DP)

Ignatius and the Princess III Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ...
  • Sara_YF
  • Sara_YF
  • 2016年08月10日 21:30
  • 151

正整数拆分问题

Problem 1 求将正整数N无序拆分成若干个不大于M的正整数的方案数 设f[i][j]f[i][j]表示ii拆分成若干个不大于jj的正整数的方案数 考虑第ii个数的大小是否为jj f[i]...

整数拆分问题详解

问题:  给定一个整数n,要找出n能拆分成多少种不同的若干个数的和与乘积的形式。比如:     4=4                   12=1*12     4=1+3             ...

整数拆分问题的四种解法

经典整数拆分的问题的算法设计与实现,分别给出递归版本、动态规划版本、五边形数定理版本、母函数版本四种算法设计与实现...

整数的拆分问题(允许重复)

整数的任意拆分问题(允许重复)问题:输入两个整数n 和m,从数列1,2,3.......n 中随意取几个数(允许重复取同一个数), 使其和等于m ,要求将其中所有的可能组合列出来.分析:记整数k的所有...

拆分5位整数

  • 2013年12月08日 09:53
  • 401B
  • 下载

整数拆分并逆置

  • 2012年10月17日 23:00
  • 239B
  • 下载

算法回忆录:母函数解决整数拆分

省略了很多内容,所以需要一定基础才可阅读。主要为了说清母函数如何解决此问题。 整数拆分: 1、整数拆分可以理解为苹果放盘子问题(把N个苹果放在M个盘子里有多少种方法),只是这是相当于把N个苹果放在...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:整数拆分问题(1)
举报原因:
原因补充:

(最多只允许输入30个字)