zoukankan      html  css  js  c++  java
  • 「BZOJ2721」「LuoguP1445」 [Violet]樱花(数论

    题目背景

    我很愤怒

    题目描述

    求方程 $frac{1}{x}+frac{1}{y}=frac{1}{N!}$ 的正整数解的组数,其中$N≤10^6$。

    解的组数,应模$1e9+7$。

    输入输出格式

    输入格式:

    输入一个整数N

    输出格式:

    输出答案

    输入输出样例

    输入样例#1: 复制
    1439
    输出样例#1: 复制
    102426508

    题解

    看到原题面的我也很愤怒。

    显然是道数论题,所以我们要去分析它的性质。

    $frac{1}{x}+frac{1}{y}=frac{1}{n!}$

    $frac{x+y}{x*y}=frac{1}{n!}$

    $xy-(x+y)*(n!)=0$

    $(n!)^2+xy-(x+y)*n!=(n!)^2$

    $(x-n!)*(y-n!)=(n!)^2$

    设$t=(n!)$

    $(x-t)*(y-t)=t^2$

    ∵$x,y$是正整数,∴$x-t>0$且$y-t>0$

    (若要小于0,则$(x-t)$和$(y-t)$中至少要有一个小于$-t$,也就是$x<0$或$y<0$,与题设不符

    设$A=(x-t)$,$B=(y-t)$

    则有$A*B=t^2=(n!)^2$

    所以$A$的方案数就是$(n!)^2$的因子数,也就是一些质因子乘起来的结果。

    所以把$(n!)^2$分解质因数,设为$(n!)^2={a_1}^{p_1}*{a_2}^{p_2}...*{a_m}^{p_m}$

    则答案为$(p_1+1)*(p_2+1)*...*(p_m+1)$。

     1  qwerta 
     2 P1445 [Violet]樱花 Accepted 
     3 100
     4 代码 C++,0.54KB
     5 提交时间 2018-10-23 22:08:48
     6 耗时/内存 86ms, 2692KB
     7 #include<iostream>
     8 #include<cstdio>
     9 using namespace std;
    10 bool sf[1000003];
    11 int p[1000003];
    12 int main()
    13 {
    14     int n;
    15     scanf("%d",&n);
    16     int tos=0;
    17     for(int i=2;i<=n;++i)
    18     if(!sf[i])
    19     {
    20         p[++tos]=2;//因为是(n!)的平方,所以次数+=2
    21         for(int j=2;i*j<=n;++j)
    22         {
    23             int x=i*j;
    24             sf[x]=1;
    25             while(x%i==0)
    26             {
    27                 p[tos]+=2;
    28                 x/=i;
    29             }
    30         }
    31     }
    32     /*
    33     for(int i=2;i<=n;++i)
    34     {
    35         int x=i;
    36         for(int j=1;j<=tos&&x>1;++j)
    37         {
    38             while(x%st[j]==0)
    39             {
    40                 p[j]+=2;
    41                 x/=st[j];
    42             }
    43         }
    44     }
    45     */注释掉的是暴力分解2~n的质因数,亲测T上天
    46     long long ans=1,mod=1e9+7;
    47     for(int i=1;i<=tos;++i)
    48     ans=(ans*(p[i]+1))%mod;//统计答案
    49     cout<<ans;
    50     return 0;
    51 }
  • 相关阅读:
    VirtualBox 安装增强工具Guest Additions 【转载】
    全面认识计算机启动过程【转载】
    Linux下使用mke2fsk格式化虚拟磁盘分区的方法
    什么是posix
    bochs默认没有pci的
    剑指offer中二进制中1的个数
    原码、补码、反码的概念
    初识hadoop
    chord原理的解读
    深度学习概述:从感知机到深度网络
  • 原文地址:https://www.cnblogs.com/qwerta/p/9841719.html
Copyright © 2011-2022 走看看