hdu-1299 Diophantus of Alexandria(分解素因子)

思路:

因为x,y必须要大与n,那么将y设为(n+k);那么根据等式可求的x=(n2)/k+n;因为y为整数所以k要整除n*n;

那么符合上面等式的x,y的个数就变为求能被n*n整除的数k的个数,且k>=n;

那么k就在n到n*n之间,不过这样不则么好求。

因为x,y具有对称性,从y=(n+k)和x=(n2)/k+n;也可以看出(n*n/k,和k等价因为k*(n*n/k)=n*n);

由于任何数都可以拆成素数的乘积,形式为a1^x1*a2^x2*a3*^x3......;

那么因数的个数为(1+x1)*(1+x2)*(1+x3)......,要求的是n*n,,n和n*n的素因子种类是相同的,所以n*n的因数个数为(1+2*x1)*(1+2*x2)*(1+2*x3).....;

那么求n*n的因数个数,只要求n的因数个数。

求因数个数就要先求素因数,求n的素因数打表就行了,素数打表只要打到1e5就行了,

因为在sqrt(n)之后如果要有n的素因数的话只会有一个因为如果有两个大与sqrt(n)的素因数那么设一个x1,另一个x2,就有x1*x2>n,

所以不可能有两个以上的且大于sqrt(n)的素因数。那么如果前面的素数中找完后,n还>1,那么此时n就是那个素因数,那么这对应素数的重复个数就为1。

关于因数个数(1+x1)*(1+x2)*(1+x3)......中1+xk表示的是第k个素因数能选的不同数量,那么乘起来就是不同的因数个数(1+x1)*(1+x2)*(1+x3)......了;

 1 #include<stdio.h>
 2 #include<algorithm>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<iostream>
 6 #include<math.h>
 7 const int Y=1e5+3;
 8 const int uu=1e5;
 9 const int Z=1e4;
10 bool flag[Y];
11 int prime[Z];
12 using namespace std;
13 int main(void)
14 {
15     int n,i,j,k,p,q;
16     memset(flag,0,sizeof(flag));
17     flag[0]=true;
18     flag[1]=true;
19     for(i=2; i<1000; i++)
20     {
21         if(!flag[i])
22         {
23             for(j=i; j*i<=uu; j++)
24             {
25                 flag[i*j]=true;
26             }
27         }
28
29     }
30     int cnt=0;
31     for(i=2; i<uu; i++)
32     {
33         if(flag[i]==false)
34         {
35             prime[cnt++]=i;
36         }
37     }//素数打表存0到1e5间的素数。
38     cin>>k;
39     {
40         for(q=1; q<=k; q++)
41         {
42             cin>>p;
43             int sum=1;
44             for(i=0; i<cnt&&p>1; i++)
45             {
46                 for(j=0; p%prime[i]==0; j++)
47                 {
48                     p=p/prime[i];
49                 }//每个素因子的个数
50                 sum*=(1+2*j);
51             }
52             if(p>1)//特判,在1e5之后的p的素因子(最多一个)。
53             {
54                 sum*=3;
55             }
56             cout<<"Scenario #"<<q<<":"<<endl;
57             cout<<(sum+1)/2<<endl;//因为在x,y相等时只算了一次,所以要加1
58             printf("\n");
59         }
60     }
61     return 0;
62
63 }
时间: 2024-10-13 11:20:10

hdu-1299 Diophantus of Alexandria(分解素因子)的相关文章

hdu 1299 Diophantus of Alexandria(数学题)

题目链接:hdu 1299 Diophantus of Alexandria 题意: 给你一个n,让你找1/x+1/y=1/n的方案数. 题解: 对于这种数学题,一般都变变形,找找规律,通过打表我们可以发现这个答案只与这个数的因子有关. n=a1^p1*a2^p2*...*an^pn ans=((1+2*p1)*(1+2*p2)*...*(1+2*pn)+1)/2 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i<=b;

hdu 1299 Diophantus of Alexandria (数论)

Diophantus of Alexandria Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2269    Accepted Submission(s): 851 Problem Description Diophantus of Alexandria was an egypt mathematician living in Ale

hdu 1299 Diophantus of Alexandria

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1299 题目大意:就是给你一个n,求1/x+//y=1/n正整数解的个数. 思路:首先我们可以在两边同时乘以xyn得yn+xn=xy,然后因式分解的(x-n)*(y-n)=n*n.这题要求解的个数,就变成了求n*n的因子数,网上很多人都是令y=n+k,然后的x=(n*n)/k+n,这儿也是求n*n的因子数. 通过数论的中的学习我们知道任意一个数n都可以由素数表示出来,即: n=p1^e1*p2^e2*

hdu 1299 数论 分解素因子

题意:求1.1/x+1/y=1/z 给定z 求x,y的个数zsd:1: 要知道这个素数的因子的范围 范围为2--sqrt(n);2: 带入方程得:x = n * n / k + n ; 现在就变成了求x的值.又因为n一定大于k,所以转换成求n * n的分解数: 因为n = p1 ^ e1 * p2 ^ e2 *..........*pn ^ en sum ( n)= ( 1 + e1 ) * ( 1 +e2 ) * .........* ( 1 +en ); sum (n * n) = ( 1

LightOJ 1340 - Story of Tomisu Ghost 阶乘分解素因子

http://www.lightoj.com/volume_showproblem.php?problem=1340 题意:问n!在b进制下至少有t个后缀零,求最大的b. 思路:很容易想到一个数通过分解素因子可以得到最大的指数.那么问题关键在于求得n!的素因子的指数,找到指数大于t的所有素因子,再将那些指数除去t,剩下的数就是最大的b了.分解阶乘时,对n不断除素数p,直到n为0时,此时商的和即该素因子的指数. /** @Date : 2016-11-30-19.35 * @Author : Lw

【小方法--最简】C - 分解素因子

C - 分解素因子Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:10240KB     64bit IO Format:%lld & %llu Submit Status    Description 假设x是一个正整数,它的值不超过65535(即1< x < =65535),请编写一个程序, 将x分解为若干个素数的乘积.    Input 输入的第一行含一个正整数k (1<=k

hdu 1299

这个方法太厉害了 别人的记录一下 #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<bitset> #include<iomanip> using namespace std; #define MAX_PRIME 31700 #define PRIME_NUM 3500 int

Foj 1075 分解素因子

题目链接:http://acm.fzu.edu.cn/problem.php?pid=1075 思路:分解素因子 #include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn=65535+5; typedef long long LL; bool prime[maxn]; int p[maxn/10]; int k; void isprime()

HDU 3641 Treasure Hunting (二分+分解质因子)

题目链接:HDU 3641 Treasure Hunting 题意:求X!%M==0中最小的的X.其中M=a1^b1*a2^b2*a3^b3.... 思路:求余为0想到整除,即分母的因子构成的集合是分子的因子构成的集合的子集.因子又想到,任何一个整数都可以分解成若干个素数相乘. 注意:题目数据很大,查到答案时二分. AC代码: #include<stdio.h> #include<string.h> #define ll __int64 bool Prime[210]; ll nu