您的位置:首页 > 其它

回溯法 百炼2749:分解因数

2012-05-07 13:16 537 查看


2749:分解因数

View

Submit

Statistics

Clarify

Time Limit:
1000ms
Memory Limit:
65536kB

Description
给出一个正整数a,要求分解成若干个正整数的乘积,即a = a1 * a2 * a3 * ... * an,并且1 < a1 <= a2 <= a3 <= ... <= an,问这样的分解的种数有多少。注意到a = a也是一种分解。
Input
第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个正整数a (1 < a < 32768)
Output
n行,每行输出对应一个输入。输出应是一个正整数,指明满足要求的分解的种数
Sample Input
2
2
20


Sample Output
1
4


View

Submit

Statistics

Clarify

#include<stdio.h>

#include<iostream>

using namespace std;

int a;

int res;

int sum;

void dfs(int cnt){

if(cnt*sum==a){res++; return;}

if(cnt*sum<a){

sum*=cnt;

int j=a/sum;

for(int i=cnt;i<=j;i++)

dfs(i);

sum/=cnt;

return;

}

}

int main(){

int nCases;

scanf("%d",&nCases);

for(int i=0;i<nCases;i++){

scanf("%d",&a);

res=0; sum=1;

for(int i=2;i<=a;i++) dfs(i);

printf("%d\n",res);

}

return 0;

}

#include<stdio.h>

int decomposition(int m,int k){

int res=1;

for(int i=k;i*i<=m;i++){

if(m%i==0&&m/i>=i){

//printf("%d ",i);

res+=decomposition(m/i,i);

}

}//printf("\n");

return res;

}

int main(){

int n;

while(scanf("%d",&n)==1){

for(int i=0;i<n;i++){

int m;

scanf("%d",&m);

printf("%d\n",decomposition(m,2));

}

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: