首页 > 其他分享 >题解:阶乘

题解:阶乘

时间:2024-01-19 21:46:41浏览次数:39  
标签:int 题解 ll sqrt times cdots 阶乘 define

题目大意

给定一个数 \(n\),求两个数 \(a\),\(b\),使 \(\Large\frac{a!}{b!}\normalsize = n(a>b)\)。
若有无数组解输出 -1
多组数据。

思路简析

\[a! = a\times(a-1)\times(a-2)\times\cdots\times2\times1 \]

\[b! = b\times(b-1)\times(b-2)\times\cdots\times2\times1 \]

所以

\[\frac{a!}{b!} = a\times(a-1)\times(a-2)\times\cdots\times(b+1)\times b = \prod_{i=b}^{a} i \]

即求一段连续数列的积。

简单思考下:因为乘法增长速率是很快的,所以只需要观察每个 \(n\)。

呃呃我也不知道怎么说,但是你想:
\(\sqrt[1]{n} = n\)
\(\sqrt[2]{n} \times \sqrt[2]{n} = n\)
\(\sqrt[3]{n} \times \sqrt[3]{n} \times \sqrt[3]{n} = n\)
\(\sqrt[4]{n} \times \sqrt[4]{n} \times \sqrt[4]{n} \times \sqrt[4]{n} = n\)
\(\sqrt[5]{n} \times \sqrt[5]{n} \times \sqrt[5]{n} \times \sqrt[5]{n} \times \sqrt[5]{n} = n\)
\(\cdots\)
\(1 < \sqrt[n]{n} < 2\)

由于 \(a\)、\(b\) 都是正整数,所以显然不是小数。

然后就能遍历长度(\(a-b\))来进行判断。

E.G.:
\(5! = 120\)
\(\sqrt[5]{120} = 120^{\frac{1}{5}} \approx 3\)

而 \(4 \cdot 5 \cdot 6 = 120\).

显然能得到一个结论即在 \(\sqrt[x]{n}\) 附近的 \(x\) 个数才有可能符合条件。

那么求出 \(\sqrt[x]{n}\) 再用其求即可。

点击查看代码
/*
compiling in hszxoj
standard C++14 -O2
ide VScode
g++ test.cpp -o test && ./test
*/
#include <bits/stdc++.h>
// #include <bits/extc++.h>
namespace {
#define filein(x) freopen(x".in", "r", stdin)
#define fileout(x) freopen(x".out", "w", stdout)
#define file(x) filein(x), fileout(x)
using namespace std;
// using namespace __gnu_pbds;
#define ll long long
#define db double
#define un unsigned
#define ui un int
#define ull un ll
#define udb un db
template <typename T>
using pr = pair<T, T>;
#define pii pr<int>
#define pll pr<ll>
#define pdb pr<db>
#define fir first
#define sec second
#define mp(x, y) make_pair(x, y)
const int man = 2.5e5+10, mam = 2.5e5+10;
}

int T;
ll n;
priority_queue<pii, vector<pii >, greater<pii > > q;
void pres () ;
int main () {
    pres();
    scanf("%d", &T);
    while (T --) {
        scanf("%lld", &n);
        if (n == 1) puts("-1");
        else {
            int res = 0, l, r;
            ll np;
            for (int i = 2; i <= n; ++ i) {
                db p = pow(n, 1.0/db(i));
                if (p < 2) break; // * = i√n
                np = 1, l = max(1, int(p-i)), r;
                for (r = max(int(p-i+1), 1); r <= p; ++ r) np *= r;
                -- r;
                for (int j = p-i+1; j <= min((ll)(p+i-1), n); ++ j) {
                    // if (i == 2) printf("AAK%d %d %lld %d %d\n", i, int(p), np, l, r);
                    if (np==n && r-l == i) {
                        ++ res;
                        q.push(mp(r, l));
                        break;
                    } if (r-l == i) np /= ++l;
                    // if (i == 2) printf("BBK%d %d %lld %d %d\n", i, int(p), np, l, r);
                    np *= ++r;
                }
            } printf("%d\n", res+1);
            while (q.size()) {
                printf("%d %d\n", q.top().fir, q.top().sec);
                q.pop();
            } printf("%lld %lld\n", n, n-1);
        }
    } return 0;
}

// --- 

void pres () {
// #ifndef ONLINE_JUDGE
    file("jc");
// #endif
    return ;
}

标签:int,题解,ll,sqrt,times,cdots,阶乘,define
From: https://www.cnblogs.com/stamorlin/p/17975699/solulation-jc

相关文章

  • 【LGR-172-Div.4】洛谷入门赛 #19 题解
    比赛链接:\(link\)T1分饼干I题目描述洛谷网校举行了期末考试,同学们经过课程的学习,考出了优异的成绩。Z在考试中获得了第一名,yz在考试中获得了第二名,老师决定买一些饼干奖励两名小朋友。老师买了三盒饼干,第一盒有\(a\)块饼干,第二盒有\(b\)块饼干,第三盒有\(c\)块饼干......
  • 题解 CF1909H
    题意给定一个长度为\(n\)的排列\(p\)。你可以进行不超过\(10^6\)次操作,每次操作是选择一个长度为偶数的区间\([l,r]\),然后交换\((p_l,p_{l+1}),(p_{l+2},p_{l+3}),...,(p_{r-1},p_r)\)。你需要将排列排序。数据范围:\(n\le3\times10^5\)。题解刚才有个群友问我Z......
  • $20240119$ 练习题解
    \(20240119\)练习题解CF472D通过尝试我们容易发现,与点\(1\)最近的点一定是直接儿子。我们要是把它作为突破点,那就成功了一半了。假设点\(2\)与点\(1\)最近,又假设我们可以用函数\(F(x)\)来确定\(x\)点的子树形态。那我们会发现如果我们还有剩余的节点,那么剩余的节点......
  • 洛谷 P9869 [NOIP2023] 三值逻辑 题解
    Solution模拟程序,容易发现每个点最后的取值都是定值或一个点的初始值(可能是该值取反)。最后是定值的点可以确定初始值,最后取值由该点决定的点也可以确定取值。求出这些取值,答案加上取之为U的点的个数。即第\(i\)个点最后的取值是\(to_i\)的初始值,\(sg_i\)表示是否取反,那......
  • 洛谷 P9751 [CSP-J 2023] 旅游巴士 题解
    Solution能在起点等\(k\)的非负整数倍相当于能在任意点等\(k\)的非负整数倍。由于离开的时间要是\(k\)的负整数倍,将每个点拆成\(k\)个点,\(dis_{i,j}\)表示到了第\(i\)个点长度\(\bmod\text{}k\equivj\)的最短路径。转移时若时间未到,直接在原地等\(k\)的负整......
  • 洛谷 P9745 「KDOI-06-S」树上异或 题解
    Solution树形DP好题。PartI部分分类比下文为简单,我们称一个连通块的权值为连通块内点的异或和。考虑链的部分分,显然可以设\(f_{i}\)是前\(i\)个点所有断边方案的权值和,对于每个点枚举上一条断的边转移。令\(s_i=\bigoplus_{j=1}^{i}a_j\),则\(f_i=\sum_{j=0}^{i-1}(s......
  • 洛谷 P9579「Cfz Round 1」Elevator 另类题解
    一个赛时想到的另类DP做法。Solution容易将原题转化为一个人乘电梯每次上下一层。对于\(a_i<b_i\)是好处理的,记\(\displaystylem=\max_{1\leqi\leqn}\{a_i,b_i\}\),只需要跑到\(m\)即可解决所有这种条件。对于\(a_i>b_i\)的条件,我们除了到\(m\)外,还需要额外地从......
  • 洛谷 P9575 「TAOI-2」喵了个喵 Ⅳ 题解
    Solution先求出所有数的最大公约数\(d\),然后将每个数约去\(d\)。将约去后的数均分,约去前的数也均分。下文讨论的数都是约去\(d\)后的数(包括取的\(x\))。\(n\)为偶数,取\(x=1\),对半分即可。\(n\)不为偶数,且有奇数个偶数。取\(x=2\),设奇数和偶数分别有\(x,y\)个,B组取......
  • 洛谷 P9915 「RiOI-03」3-2 题解
    Preface为啥有蓝啊,这题在机房里15min左右就切了,反倒是2A做了1h。。Solution将矩阵逆时针旋转\(90^{\circ}\),你会发现这是一棵线段树,是父亲左儿子的节点颜色是\(0\),是右儿子的节点颜色是\(1\)。容易发现,联通块一定是一条链。具体地,你从给定的点向上跳,跳到第一个与自己......
  • CF1895E Infinite Card Game 题解
    Solution根据贪心策略,可以发现出完一张牌后对手的出牌是固定的。同理可以算出Monocarp出完一张牌\(a\)后下一次出的牌\(to_a\)。\(a\)和\(to_a\)胜负状态相同。可以发现对所有\(a\)建\(a\toto_a\)后形成的图是内向基环树,一遍dfs即可求出答案。时间复杂度\(\m......