• LOJ10202樱花——数论


    题目描述

    原题来自:HackerRank Equations

    求不定方程:

     1/x+1/y=1/n!

    的正整数解 (x,y) 的数目。

    输入格式

    一个整数 n 

    输出格式

    一个整数,表示有多少对 (x,y) 满足题意。答案对 1e9+7 取模。

    样例

    样例输入

    2
    

    样例输出

    3
    

    样例说明

    共有三个数对 (x,y) 满足条件,分别是 (3,6),(4,4) 和 (6,3)

    数据范围与提示

    对于 30% 的数据,n<=100
    对于全部数据,n<=1e6

    ___________________________________________________________________

    数论题,关键一步真的想不到!

    由于题目是正整数解,所以x,y都大于n

    题目很容易化为n!=xy/(x+y)

    由于x,y大于n!。所以x设为n!+a,y设为n!+b。

    上面的式子就可以化为(n!)^2=a*b

    也就是上面的式子,a,b有多少中解!

    所以,首先求出n中的质数,然后求出所有的质数在n!中出现的次数,而(n!)^2中的后的质数的个数要乘以2,让后就是求所有因数的个数。

    ___________________________________________________________________

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=1e6;
     4 int n;
     5 int prime[maxn],cnt[maxn];
     6 bool sz[maxn];
     7 int js;
     8 void getprime(int n)
     9 {
    10     sz[0]=sz[1]=1;
    11     for(int i=2;i<=n;++i)
    12     {
    13         if(sz[i]==0)prime[js++]=i;
    14         for(int j=0;j<js&&prime[j]*i<=n;++j)
    15         {
    16             sz[prime[j]*i]=1;
    17             if(i%prime[j]==0)break;
    18         }
    19     }
    20 }
    21 void fenjie(int x)
    22 {
    23     for(int i=0;prime[i]*prime[i]<=x;++i)
    24         while(x%prime[i]==0)
    25         {
    26             x/=prime[i];
    27             cnt[prime[i]]++;
    28         }
    29     if(x!=1)cnt[x]++;
    30 }
    31 long long ans=1;
    32 int main()
    33 {
    34     cin>>n;
    35     getprime(n);
    36     for(int i=2;i<=n;++i)fenjie(i);
    37     for(int i=2;i<=n;++i)ans=(ans*((cnt[i]<<1)+1))%1000000007;
    38     cout<<ans;
    39     return 0;
    40 }
    View Code
  • 相关阅读:
    HashSet
    HashMap
    commons-configuration读取配置文件
    JAVA多线程和并发基础面试问答(转载)
    集合
    java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和联系
    七段数码管绘制
    函数的定义与使用
    程序的分支控制
    文本进度条
  • 原文地址:https://www.cnblogs.com/gryzy/p/11496229.html
Copyright © 2020-2023  润新知