#P1256. 机甲组装

机甲组装

题目背景

众所周知,小狐芦擅长计算,尤其擅长计算组合数,然而这道题和组合数并没有什么关系。

自从上次小狐芦的机甲败给了小蝙狐后,小狐芦一直在组装机甲。

对于一个数值为 kk1k(k\ge1) 未组装过的机甲所拥有的力量为 k!!k!!

(我们定义 $n!! = \begin{cases} {n \times (n - 2) \times \cdots\times 3 \times 1,(n为奇数)}\\ {n\times(n - 2)\times\cdots\times 4 \times 2,(n为偶数)}\end{cases}$)。

小狐芦觉得单个机甲的数值太小了,所以打算用所有数值小于等于 kk 的机甲组装一个更大的机甲(每个数值的机甲只使用一个),经过组装的机甲的力量为其组成部分力量的乘积(即由这 kk 个机甲组装起来的机甲力量为 i=1ki!! \prod \limits_{i=1}^{k} {i!!} )。在机甲战斗时,每次均会使自己与对方的力量缩小到原来的 110\frac{1}{10}。由于机甲十分精密,当机甲的力量不为整数时便会损坏。

小狐芦想知道自己组装起来的机甲在不损坏的前提下最多可以战斗几次,以此来估计可不可以战胜小蝙狐,所以他想请教你来帮忙解决这个问题。

注意:

本题由于答案可能很大,因此建议:

  1. 使用 python 提交

  2. 使用 __int128 (下方是 __int128 的具体使用方法)

    #include<bits/stdc++.h>
    using namespace std;
    
    //__int128的输入输出方法
    void scan(__int128 &x)//输入
    {
    	x=0;int f=1;char ch=getchar();
    	while (!isdigit(ch)){if (ch=='-')f=-1;ch=getchar();}
    	while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
    	x*=f;
    }
    inline void print(__int128 x)//输出
    {
    	if(x<0){
    		putchar('-');
    		x=-x;
    	}
    	if(x>9) print(x/10);
    	putchar(x%10+'0');
    }
    
    int main(){
        __int128 a, b, c;
        scan(a), scan(b);
        c = a + b;
        print(c);
    }
    

输入

输入一行,包含一个正整数 kk1k10181\le k \le 10^{18}

输出

只有一行,包含一个整数,表示答案。

样例

5
1
22
22

样例说明

样例1

k=5k=5 时,组装出的机甲力量为 1×2×3×8×15=7201 \times 2\times 3\times 8 \times 15=720 ,战斗一次后力量值变为 7272 ,由于再次战斗其力量值不再为整数,因此最多可战斗 11 次。