zjzj只爱数学--一道很厉害的题目(原创)

题目背景

\(zjzj\) 大佬最喜欢的,就是找到一些红的数学题,把他们改变成蓝的,紫的,甚至黑的。

题目描述

有一天, \(zjzj\) 大(jù)佬(ruò) 看到了 \(fxt\) 蒟(dà)蒻(lǎo)出的一道题 \(:\) \(wangshengjun33\)\(275307894a\) (大佬) 和 \(A\_rsj\) (大佬) 以及一坨人在玩石头剪子布。玩着玩着,三人感觉不对劲,人越多越决不出胜负,他们想知道有几种可能决不出胜负。 (注意,本题不计顺序。不计顺序:例如甲出石头,乙出剪刀,丙出布与甲出布,乙出石头,丙出剪刀是同一种可能)

于是 \(zjzj\) 大(jù)佬(ruò) 把这道题改成了另一道题 \(:\) 有一坨人在玩游戏,每个人可以出 \(a,b,c,d\) 的任意一种,规定只有 \(a,b,c,d\) 同时出现时才会决不出胜负,问有多少种可能决不出胜负,同样也是不记顺序。

\(zjzj\) 大(jù)佬(ruò)又觉得这道题太简单了,于是又改了改 \(:\) 有一坨人在玩游戏,每个人可以出 \(a,b,c,d,e······\) 总共 \(k\) 种中的任意一种,规定只有同时出现 \(k\) 种时才会决不出胜负,问有多少种可能决不出胜负,同样也是不记顺序。

\(zjzj\) 大(jù)佬(ruò)又觉得太简单了,然后又改了改 \(:\) 规定有 \(n\) 个人,可以出 \(k\) 种时的答案为 \(f(k,n)\),求

\(\sum_{i=1}^{n}f(i,n)\)

\(zjzj\) 大(jù)佬(ruò)给这道题评了个橙标签,所以这是第一题 \(qwq\)

输入格式

一个数 \(:\) \(n\)

输出格式

一个数,为那个式子的答案 \(\%1152921504606846975\)

输入输出样例

输入 #1 复制
2
输出 #1 复制
2

说明/提示

对于\(20\%\) 的数据,\(1\leq n\leq5\)

对于\(40\%\)的数据,\(1\leq n\leq10\)

对于\(60\%\)的数据,\(1\leq n\leq5000\)

对于\(80\%\)的数据,\(1\leq n\leq 10^5\)

对于\(100\%\)的数据,\(1\leq n\leq5\times10^{10^7}\)

思路

这道题嘛,有点意思。

首先,我们换一个 \(n\),变成 \(5\),则一定要这样:

\(i\) 的值
1 a
2 a b
3 a b c
4 a b c d
5 a b c d e

这样,每一局就已经可以分不出胜负

然后我们只要求剩下的空还可以填的方案数总和

然后,我先把后面的一些排个序,就是这样的:\(a,...,a,b,...,b,c,...,c...\),再用数学建模的思想,把切换字母看成横坐标+1,把加一个数看成纵坐标加一,这样就可以得出 \(f_{i,j}=f_{i-1,j}+f_{i,j-1}\)

这不就是一个杨辉三角吗

那么要求的东西刚好就是同一层的杨辉三角的和

因为杨辉三角是求\((a±b)^{n-1}\)的各项的系数,所以如果把它展开就是\((a±b)(a±b)...(a±b)\),所以系数和就是总的展开的项的个数 ( 没有合并 ) ,所以系数和就是 \(2^{n-1}\)

或者,用另一种易懂的方法,就是展开后,我们让每一项的字母的乘积都为1,那么这个系数的总和就是这个式子的值,那么这样的话,\(a,b\)就要等于1,系数和就是 \(2^{n-1}\)

所以,只要求 \(2^{n-1}\) 的值就可以了(绕了多大的弯啊)

那么,这样还是只有 \(80\) 分,所以,看一下这个模数 \(1152921504606846975\),就是 \(2^{60}-1\) 所以,当 \(n=61\) 时,这个值又回到了当 \(n=1\) 的时候,所以这样就可以不用这么大的复杂度了

只需要求\(2^{(n-1)\%60}\)的值就可以了

比如说我们想要求 \(623421\%60\) 的值

\(\ \ \ \ \ \ \ \ \ 10309\)
\(60\sqrt{}\overline{623421}\)
\(\ \ \ \ \ \ \ \underline{60\ \ \ \ \ }\)
\(\ \ \ \ \ \ \ {\ \ 23\ \ }\)
\(\ \ \ \ \ \ \ \ \ \underline{\ \ 0\ \ \ \ \ }\)
\(\ \ \ \ \ \ \ {\ \ 234}\)
\(\ \ \ \ \ \ \ \ \ \underline{180\ \ \ \ }\)
\(\ \ \ \ \ \ \ \ \ {\ \ 54}\)
\(\ \ \ \ \ \ \ \ \ \ \ \underline{0\ \ \ \ \ \ \ \ }\)
\(\ \ \ \ \ \ \ \ \ {\ \ 542}\)
\(\ \ \ \ \ \ \ \ \ \ \ \underline{540\ \ \ \ \ }\)
\(\ \ \ \ \ \ \ \ \ {\ \ \ \ \ \ 21}\)

然后如何实现呢?

  1. 输入6,k=6
  2. 输入2,k=62%60=2
  3. 输入3,k=23%60=23
  4. 输入4,k=234%60=54
  5. 输入2,k=542%60=2
  6. 输入1,k=21%60=21

代码

#include<bits/stdc++.h>
using namespace std;
unsigned long long a=1,mod=1152921504606846975;
char c;
int n;
int main(){
	c=getchar();
	while(c>='0'&&c<='9'){n=(n*10+c-'0')%60;c=getchar();}
	for(int i=1;i<n;i++)a*=2;
	cout<<a;
	return 0;
}

谢谢--zhengjun

posted @ 2022-06-11 15:14  A_zjzj  阅读(68)  评论(0编辑  收藏  举报