zoukankan      html  css  js  c++  java
  • luoguP1445 [Violet]樱花

    链接P1445 [Violet]樱花

    • 求方程 (frac {1}{X}+frac {1}{Y}=frac {1}{N!}) 的正整数解的组数,其中(N≤10^6),模(10^9+7)
    • 化简单一下$$xy-n!(x+y)=0$$
    • 因式分解一下$$(x-n!)*(y-n!)=(n!)^2$$
    • (a=x-n!,b=y-n!),那么(a*b=(n!)^2)
    • 也就是(a,b)对应了唯一一组(x,y),所以问题转化成了:求方程 (a*b=(n!)^2) 的正整数解的组数。
    • 考虑唯一分解定理,$$(n!)^2=prod p_i^{2*c_i}$$
    • 所以线性筛后分解(n!),答案就是(prod (2*c_i+1))
    #include<bits/stdc++.h>
    #define R register int
    #define ll long long 
    using namespace std;
    const int mod=1e9+7;
    const int N=1000001;
    int n,tot,ans,c[N],Mark[N],prm[N];
    int gi(){
        R x=0,k=1;char c=getchar();
        while((c<'0'||c>'9')&&c!='-')c=getchar();
        if(c=='-')k=-1,c=getchar();
        while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-'0',c=getchar();
        return x*k;
    }
    int main(){
    	n=gi(),ans=1;
    	for(R i=2;i<=n;++i){
    		if(!Mark[i])prm[++tot]=i;
    		for(R j=1;j<=tot&&prm[j]*i<=n;++j){
    			Mark[prm[j]*i]=1;
    			if(i%prm[j]==0)break;
    		}
    	}
    	for(R p=1;p<=tot;++p){
    		R i=prm[p];
    		for(R j=i;j<=n;j+=i){
    			R x=j;
    			while(x%i==0)c[i]++,x/=i;
    		}
    	}
    	for(R i=1;i<=n;++i)c[i]=(c[i]<<1)+1;
    	for(R i=1;i<=n;++i)ans=1ll*ans*c[i]%mod;
    	cout<<ans<<endl;
        return 0;
    }
    
    
  • 相关阅读:
    js基础四
    序列化和反序列化
    数组
    枚举
    Class对象和反射
    字符串String
    对象的克隆
    异常处理机制
    多继承和代码块
    接口和抽象类
  • 原文地址:https://www.cnblogs.com/Tyher/p/9917394.html
Copyright © 2011-2022 走看看