zoukankan      html  css  js  c++  java
  • 【BZOJ-2721】樱花 线性筛 + 数学

    2721: [Violet 5]樱花

    Time Limit: 5 Sec  Memory Limit: 128 MB
    Submit: 499  Solved: 293
    [Submit][Status][Discuss]

    Description

    Input

    Output

    Sample Input

     3

    Sample Output

     9

    HINT

    Source

    interviewstreet--EQUATIONS

    Solution

    巧妙!

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

    则可以得到$frac{1}{x}+frac{1}{y}=frac{1}{z}=>x=frac{yz}{y-z}$

    再另$t=y-z$则可以得到$x=z+frac{z^{2}}{t}$

    所以我们求$n!^{2}$的约数,就是答案,这就利用到线筛

    Code

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    using namespace std;
    #define P 1000000007
    #define LL long long
    int N,cnt,prime[1000100],z[1000100],tmp;
    bool flag[1000100];
    LL ans=1LL;
    void Getprime()
    {
        flag[1]=1; cnt=0;
        for (int i=2; i<=N; i++)
            {
                if (!flag[i]) prime[++cnt]=i;
                for (int j=1; j<=cnt && prime[j]*i<=N; j++)
                    {
                        flag[i*prime[j]]=1;
                        if (prime[j]%i==0) break;
                    }
            }
    }
    void Calc(int x)
    {
        for (int i=prime[x]; i<=N; i+=prime[x])
            for (int j=i; j%prime[x]==0; j/=prime[x]) z[x]++;
    }
    int main()
    {
        scanf("%d",&N);
        Getprime();
        for (int i=1; i<=cnt; i++) Calc(i);
        for (int i=1; i<=cnt; i++) printf("%d   ",z[i]); puts("");
        for (int i=1; i<=cnt; i++) ans=((LL)ans*(z[i]<<1|1)%P)%P;
        printf("%lld
    ",ans);
        return 0;
    } 
  • 相关阅读:
    ==与is区别
    词典操作
    前端工具---取色截图测量
    css零碎合集
    基于bootstrap的在线布局工具
    js常用功能工具库--Underscore.js
    前端资源荟萃
    在线绘图工具---processon
    表单form浅谈
    前端工具----iconfont
  • 原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5897712.html
Copyright © 2011-2022 走看看