p1629【找分子】

描述 Description 

给定n(2≤n≤10^9)值,要求x、y均为正整数,且x<y,并且满足1/x+1/y=1/n.
编程统计有多少对这样的x和y。

输入格式 Input Format
一个整数n。

输出格式 Output Format
一个整数,表示相应的方法数是多少。

样例输入 Sample Input
6

样例输出 Sample Output
4

时间限制 Time Limitation
1s

注释 Hint
经典数学题目

来源 Source
经典问题

    思路:先用筛法求出50000以内的素数(习惯50000了(筛法真的好用)),因为我们要对1/n分解,这里只分成了1/x+1/y=1/n,又因为x,y,n全为正整数

   且x<y。所以可知1/n=1/x+1/y => xy=nx+ny => n^2=(x-n)(y-n);所以问题就成为了求n^2的所有因子个数除以2.

   我们又可以用约束和定理等到因为,n=p1^a1*p2^a2...pk^ak,所以n的所有因数的个数为(a1+1)(a2+1)...(ak+1)。所以直接就就好了

   

   代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[5510000];
bool f[5510000];
int prime[5510000];
int main()
{
    long long n;
    cin>>n;
    memset(f,1,sizeof(f));
    memset(a,0,sizeof(a));
    for(int i=2;i<=500000;i++)//筛法求素数表
    {
        if(f[i])
        {
            for(int j=i+i;j<=500000;j+=i)
            {
                f[j]=false;
            }
        }
    }
    long long len=0;
    int m=n;
    for(int i=2;i<=500000;i++)
        if(f[i])
            prime[++len]=i;
    int l=0;
    for(int i=1;i<=len&&prime[i]<=n;i++)//记录每个素数因数有几个
    {
        if(n%prime[i]==0)
            l++;
        while(n%prime[i]==0)
        {
            a[l]++;
            n/=prime[i];
        }
    }
    if(n>1)
        a[++l]=1;
    long long ans=1;
    for(int i=1;i<=l;i++)
    {
        ans*=(2*a[i]+1);
    }
    if(ans%2==0)
        cout<<ans/2<<endl;
    else
        cout<<(ans-1)/2<<endl;
    return 0;
}
时间: 2024-10-12 18:08:18

p1629【找分子】的相关文章

JZYZOJ 1629 找分子

题目描述 给定\(n(2≤n≤10^9)\)值,要求\(x\).\(y\)均为正整数,且\(x<y\),并且满足\(\frac{1}{x}+\frac{1}{y}=\frac{1}{n}\).编程统计有多少对这样的\(x\)和\(y\). 输入格式 一个整数n 输出格式 一个整数,表示相应的方法数是多少. 样例输入 6 样例输出 4 思路 先把原方程化简 \(\frac{1}{x}+\frac{1}{y}=\frac{1}{n} \Rightarrow \frac{xy}{x+y} = \fra

UVA 725 Division ( 找出 abcde / fghij = N的形式—— 暴力枚举 )

Division Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description Write a program that finds and displays all pairs of 5-digit numbers that between them use the digits 0 through 9 once each, such that the first number divide

面向对象时钟类(倒计时),分数计算类

/** * 时钟类 * * @author Administrator * */ public class Clock { private int hour; private int minute; private int second; public Clock() { Calendar cal = Calendar.getInstance(); this.hour = cal.get(Calendar.HOUR_OF_DAY); this.minute = cal.get(Calendar.

POJ 3090

由于是对称的图形只要求一边得出sum:sum=sum*2+1就好了把起点定为原点,建立坐标系,能看到的点与原点连线的斜率是不一样的,也就是说,点(X,Y)K=Y/X(K<1)每一个K要不同:1/2出现了2/4就不能出现,从1开始计算,也就是要找分子与分母不能约分的斜率;想到的就是欧拉函数: #include <iostream> #include <cstdio> #include <algorithm> using namespace std; typedef

华南师大 2017 年 ACM 程序设计竞赛新生初赛题解

华南师大 2017 年 ACM 程序设计竞赛新生初赛题解 华南师范大学第很多届 ACM 程序设计竞赛新生赛(初赛)在 2017 年 11 月 20 日 - 27 日成功举行,共有 146 名同学有效参赛(做出 1 题).进入决赛的资格初定为完成并通过 5 题或以上,决赛时间是 12 月 3 日,地点未定. 题解 被你们虐了千百遍的题目和 OJ 也很累的,也想要休息,所以你们别想了,行行好放过它们,我们来看题解吧... A. 诡异的计数法 Description cgy 太喜欢质数了以至于他计数也

Java练习 SDUT-2253_分数加减法

分数加减法 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 编写一个C程序,实现两个分数的加减法 Input 输入包含多行数据 每行数据是一个字符串,格式是"a/boc/d". 其中a, b, c, d是一个0-9的整数.o是运算符"+"或者"-". 数据以EOF结束 输入数据保证合法 Output 对于输入数据的每一行输出两个分数的运算结果. 注意结果应符合书写习惯

20175126Apollo 20175126《Java程序设计》结队编程项目——四则运算 第一周阶段总结

结队编程项目——四则运算 一.项目需求 自动生成小学四则运算题目(加.减.乘.除)统计正确率 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 需求分析: 生成四则运算:需要使用随机数生成,需要创造一个能实现计算功能的类. 支持多运算符:运算符也需要利用随机生成,并且不限个数. 支持真分数:需要用到生成分子.分母的函数,将分数化简等. 统计正确率:需要设置一个计算变量,并需要用一个判断正确的函数. 二.设计思路 首先根据需求分析,进行大体的设计: 生成题目→输入答案→判断正

Class热替换与卸载

概述 名词解释:所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用.本文主要是分析Tomcat中关于热部署和JSP更新替换的原理,在此之前先介绍class的热替换和class的卸载的原理. Class热替换 ClassLoader中重要方法: loadClass:ClassLoader.loadClass(…) 是ClassLoader的入口点.当一个类没有指明用什么加载器加载的时候,JVM默认采用AppClassLoader加载器加载没有加载过的class,调用的方法的入口就是

PostgreSQL中查找最大连续性字段

一.建表 lihao=#create table tb (id int,pid int,name varchar); lihao=#INSERT INTO tb VALUES (1, 0, '广东省'); lihao=#INSERT INTO tb VALUES (2, 0, '浙江省'); lihao=#INSERT INTO tb VALUES (3, 2, '衢州市'); lihao=#INSERT INTO tb VALUES (4, 2, '杭州市'); lihao=#INSERT I