zoukankan      html  css  js  c++  java
  • 【BZOJ2721】【洛谷P1145】樱花【数论,数学】

    题目大意:

    题目链接:

    BZOJ:https://www.lydsy.com/JudgeOnline/problem.php?id=2721
    洛谷:https://www.luogu.org/problemnew/show/P1445

    求方程 1x+1y=1n!frac{1}{x}+frac{1}{y}=frac{1}{n!} 的正整数解的组数


    思路:

    神题啊orzorz

    以下内容大部分摘自 这里

    先通分
    x+yxy=1n!frac{x+y}{xy}=frac{1}{n!}
    交叉相乘
    (x+y)n!=xy(x+y)n!=xy
    移项得
    (x+y)n!+xy=0-(x+y)n!+xy=0
    配方
    (n!)2(x+y)n!+xy=(n!)2(n!)^2-(x+y)n!+xy=(n!)^2
    (xn!)(yn!)=(n!)2(x-n!)(y-n!)=(n!)^2
    a=(xn!),b=(yn!)a=(x-n!),b=(y-n!)
    ab=(n!)2ab=(n!)^2
    由于n!=p1c1×p2c2×...×pmcmn!=p_1^{c1} imes p_2^{c2} imes ... imes p_m^{cm},所以(n!)2=p12c1×p22c2×...×pm2cm(n!)^2=p_1^{2c1} imes p_2^{2c2} imes ... imes p_m^{2cm}
    所以总共aa的取值就是(2c1+1)(2c2+1)...(2cm+1)(2c_1+1)(2c_2+1)...(2c_m+1)
    枚举1n1sim n,把每个数字分解质因数就可以求出答案了。


    代码:

    #include <cstdio>
    #define rr register
    using namespace std;
    typedef long long ll;
    
    const int MOD=1e9+7,N=1e6+10;
    int n,prime[N],m,v[N];
    ll cnt[N],ans;
    
    void find_prime(int k)
    {
    	for (rr int i=2;i<=n;i++)
    	{
    		if (!v[i])
    		{
    			v[i]=i;
    			prime[++m]=i;
    		}
    		for (rr int j=1;j<=m;j++)
    		{
    			if (prime[j]>v[i]||prime[j]*i>n) break;
    			v[i*prime[j]]=prime[j];
    		}
    	}
    }
    
    int main()
    {
    	scanf("%d",&n);
    	find_prime(n);
    	for (rr int i=1;i<=n;i++)
    		for(rr int j=i;j!=1;j/=v[j])
              cnt[v[j]]++;
    	ans=1;
    	for (rr int i=1;i<=m;i++)
    		ans=(ans*(cnt[prime[i]]*2+1))%MOD;
    	printf("%d",ans);
    	return 0;
    }
    
  • 相关阅读:
    解决winXP无法远程桌面连到win8
    Exception处理
    Java父类与子类的内存引用讲解
    JAVA子类继承父类
    JAVA子类调用父类构造方法
    JS 矩阵转置
    JS 二分查找
    JS冒泡排序
    JS 求平均值
    关于STM32 NVIC配置的解释
  • 原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998205.html
Copyright © 2011-2022 走看看