• 51nod 1189 算术基本定理/组合数学


    www.51nod.com/onlineJudge/questionCode.html#!problemId=1189

    1189 阶乘分数

    题目来源: Spoj
    基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题
    收藏
    关注
    1/N! = 1/X + 1/Y(0<x<=y),给出N,求满足条件的整数解的数量。例如:N = 2,1/2 = 1/3 + 1/6,1/2 = 1/4 + 1/4。由于数量可能很大,输出Mod 10^9 + 7。
     
    Input
    输入一个数N(1 <= N <= 1000000)。
    Output
    输出解的数量Mod 10^9 + 7。
    Input示例
    2
    Output示例
    2

    用到了算术基本定理的性质求解N!所有素因子的个数,和乘法原理计算所有组合。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define LL long long
     4 LL mod=1e9+7;
     5 int num[1000005];
     6 bool is[1000005];
     7 void init()
     8 {
     9     is[0]=is[1]=1;
    10     int m=sqrt(1000000+0.5);
    11     for(int i=2;i<=m;++i)
    12     {
    13         if(!is[i]){
    14             for(int j=i*i;j<=1000000;j+=i)
    15                 is[j]=1;
    16         }
    17     }
    18 }
    19 int f(int N,int K)
    20 {
    21     int s=0;
    22     while(N){
    23         s+=N/K;
    24         N/=K;
    25     }
    26     return s;
    27 }
    28 int main()
    29 {
    30     int N,M,i,j,k,p=0;
    31     init();
    32     cin>>N;
    33     M=N;
    34     for(i=2;i<=M;++i)
    35     {
    36         if(!is[i])
    37             num[p++]=f(M,i);
    38     }
    39     LL res=1;
    40     for(i=0;i<p;++i)
    41     {
    42         res=res*(2*num[i]+1)%mod;
    43     }
    44     res=(res+1)*500000004%mod;
    45     cout<<res<<endl;
    46     return 0;
    47 }
    48 
    49 /*
    50 
    51 公式化简为 : (X-N!)*(Y-N!)=(N!)2        假设N!=P1a1*P2a2*......*Pnan                     
    52 那么ans=π(2*ai+1)| 1<=i<=n ,但是要求X<=Y,所以除以二之后向上取整就好了。
    53 
    54 */



  • 相关阅读:
    rpm包安装及卸载
    linux常用命令100
    Haproxy负载均衡与高可用
    nginx+keepalived实现高可用案例
    LVS+keepalived
    NFS 共享存储与LVS
    Tomcat Session简介及绑定
    LVS DR 模式
    LVS搭建
    LVS简介与集群及类型介绍
  • 原文地址:https://www.cnblogs.com/zzqc/p/7449686.html
Copyright © 2020-2023  润新知