AcWing 1294. 樱花

AcWing 1294. 樱花

一、题目描述

给定一个整数 n,求有多少正整数数对 (x,y) 满足 1x+1y=1n!

输入格式
一个整数 n

输出格式
一个整数,表示满足条件的数对数量。

答案对 109+7 取模。

数据范围
1n106

输入样例

2

输出样例

3

样例解释
共有三个数对 (x,y) 满足条件,分别是 (3,6),(4,4),(6,3)

二、解题思路

做了这题,感觉这类题目的大多数分析过程都是这样的:

  • 求有多少对整数对(x,y)满足一条方程,则方程一定存在解,将y转换为关于x的表示式,再根据y的约数条件,求出(x,y)的匹配数,即一个x对应一个y

1、确定x,y范围

1x+1y=1n!

x,yZ+
x>n! y>n! 小学数学知识~

2、推表达式

转换为y的表示式

x+yxy=1n!

变形

xn!+yn!=xy

继续变形

xn!=y(xn!)

y=xn!xn!

经典的变形技巧:

y=(xn!+n!)n!xn!

y=(xn!)n!+n!2xn!

y=n!+n!2xn!

因为上面已经证明了xn!>0的,所以要想y有正整数解,则必然需要

(xn!)|n!2

换句话说,就是n!2有多少个约数,就有相应的正整数x,也就有一个对应的y
如果我们能够求得n!2的约数个数,也就是x,y的匹配对数。

3、阶乘分解质因数

参考 Acwing197. 阶乘分解 的方法

  • 先筛出n以内的质数
  • 计算每个质数因子出现的次数
 for (int i = 0; i < cnt; i++) {
        int p = primes[i];
        int s = 0;
        for (int j = n; j; j /= p) s += j / p;
        printf("%d %d\n", p, s);
    }

4、约数个数

n!2一共有多少个约数
假设n!=P1c1×P2c2×...×Pkck
则$$n!2=P_1\times P_2^{2c_2}\times ...\times P_k^{2c_k}$$

根据约数个数定理
知道约数的个数是(2c1+1)×(2c2+1)××(2ck+1)

5、时间复杂度 O(n)

三、实现代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int MOD = 1e9 + 7;

// 欧拉筛
const int N = 1e6 + 10;
int primes[N], cnt; // primes[]存储所有素数
bool st[N];         // st[x]存储x是否被筛掉
void get_primes(int n) {
    memset(st, 0, sizeof st);
    cnt = 0;
    for (int i = 2; i <= n; i++) {
        if (!st[i]) primes[cnt++] = i;
        for (int j = 0; primes[j] * i <= n; j++) {
            st[primes[j] * i] = true;
            if (i % primes[j] == 0) break;
        }
    }
}

signed main() {
    int n;
    cin >> n;

    // 步骤1:筛质数
    get_primes(n);

    // 步骤2:阶乘质因子分解
    int res = 1;
    for (int i = 0; i < cnt; i++) {
        int p = primes[i];
        int s = 0;
        for (int j = n; j; j /= p) s += j / p;

        // 步骤3:约数个数公式
        res = res * (2 * s + 1) % MOD;
    }
    cout << res << endl;
}

posted @   糖豆爸爸  阅读(81)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2017-05-19 mysql 如何提高批量导入的速度
2015-05-19 杀掉MYSQL死锁进程
2015-05-19 成都项目中因为MYSQL与SSDB备分时间不一致,导致主键产生器错误解决一例
2014-05-19 解密2.0版资源库的文件算法
Live2D
点击右上角即可分享
微信分享提示