#线性筛#洛谷 1445 [violet] 樱花

题目

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


分析

通分得到
x + y x y = 1 n ! \frac{x+y}{xy}=\frac{1}{n!} xyx+y=n!1
那么 ( x + y ) n ! = x y (x+y)n!=xy (x+y)n!=xy
那么 x y − ( x + y ) n ! = 0 xy-(x+y)n!=0 xy(x+y)n!=0
通过十字相乘法的配方,两边同加 ( n ! ) 2 (n!)^2 (n!)2
所以 ( n ! ) 2 − ( x + y ) n ! + x y = ( n ! ) 2 (n!)^2-(x+y)n!+xy=(n!)^2 (n!)2(x+y)n!+xy=(n!)2
所以 ( n ! − x ) ( n ! − y ) = ( n ! ) 2 (n!-x)(n!-y)=(n!)^2 (n!x)(n!y)=(n!)2
那也就是求 ( n ! ) 2 (n!)^2 (n!)2的约数个数
首先要线性筛把质数求出来,然后若
( n ! ) 2 = p 1 c 1 × p 2 c 2 × ⋯ × p n c n (n!)^2=p_1^{c_1}\times p_2^{c_2}\times \dots \times p_n^{c_n} (n!)2=p1c1×p2c2××pncn
答案为 ∏ 2 ∗ c i + 1 \prod 2*c_i+1 2ci+1


代码

#include <cstdio>
#define rr register
using namespace std;
typedef unsigned uit;
const uit mod=1000000007;
uit n,v[1000001],prime[1000001],cnt; long long ans=1;
signed main(){
    scanf("%u",&n);
    for (rr uit i=2;i<=n;++i){
        if (!v[i]) v[i]=prime[++cnt]=i;
        for (rr uit j=1;j<=cnt&&prime[j]*i<=n;++j){
            v[i*prime[j]]=prime[j];
            if (i%prime[j]==0) break;
        }
    }
    for (rr uit i=1;i<=cnt;++i){
        rr long long tot=0,j=prime[i];
        for (;j<=n;tot+=n/j,j=j*prime[i]);
        ans=ans*(tot<<1|1)%mod;
    }
    return !printf("%lld",ans);
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值