zoukankan      html  css  js  c++  java
  • 洛谷 P1445 没占到1444的愤怒

    传送门
    不得不吐槽一句,这题出题人真的很逗
    以下我copy一段别人的题解:

    1/x+1/y=1/n!
    先通分
    (x+y)/xy=1/n!
    再化整数
    xy-(x+y)*n!=0
    然后配平
    (n!)^2-(x+y)*n!+xy=(n!)^2
    最后
    (x-n!)*(y-n!)=(n!)^2
    然后我们发现x,y都要是正整数;
    所以原题可以变为
    A*B=(n!)^2;
    当A*B为正整数的时候x,y显然也是正整数;然后我们考虑x的取值,显然,若一个质数p有k个,那么x可以取p^0,p^1….p^k
    共(k+1)种情况
    乘法原理乘起来就可以了
    而且显然,x确定后,y必然也会被确定
    那么我们先可以欧拉筛;
    求出每个数的最小质因数然后大力就好了;

    其实就是质因数分解,枚举约数个数
    直接贴代码了:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cstdlib>
    #include<cmath>
    #include<vector>
    #include<queue>
    #define ll long long
    using namespace std;
    ll prime[500000];
    bool vis[1000001];
    ll n,cnt;
    void init(){
        for(int i=2;i<=n;i++){
            if(!vis[i]){
                prime[++cnt]=i;
            }
            for(int j=1;j<=cnt&&(ll)i*(ll)prime[j]<=n;j++){
                vis[i*prime[j]]=1;
                if(i%prime[j]==0)break;
            }
        }
    }
    
    int main(){
        scanf("%lld",&n);
        init();
        ll ans=1;
        for(int i=1;i<=cnt;i++){
            ll c=0;
            for(ll j=prime[i];j<=n;j*=prime[i]){
                c+=n/j;
            }
            ans*=(c*2+1);
            ans%=1000000007;
        }
        printf("%lld",ans);
        return 0;
    }
  • 相关阅读:
    C语言文法
    实验一
    词法分析
    py中文词频统计
    py字符串练习
    py画了个国旗
    熟悉常用的Linux操作
    大数据概述
    实验三、 递归下降分析程序实验
    简易c语言LL(1)文法
  • 原文地址:https://www.cnblogs.com/stone41123/p/7581248.html
Copyright © 2011-2022 走看看