题目背景
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),求
∑i=1nf(i,n)
zjzj 大(jù)佬(ruò)给这道题评了个橙标签,所以这是第一题
qwq。
输入格式
一个数
:
n
输出格式
一个数,为那个式子的答案
%1152921504606846975
输入输出样例
输入 #1 复制
2
输出 #1 复制
2
说明/提示
对于
20% 的数据,
1≤n≤5
对于
40%的数据,
1≤n≤10
对于
60%的数据,
1≤n≤5000
对于
80%的数据,
1≤n≤105
对于
100%的数据,
1≤n≤5×10107
思路
这道题嘛,有点意思。
首先,我们换一个
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,把加一个数看成纵坐标加一,这样就可以得出
fi,j=fi−1,j+fi,j−1
这不就是一个杨辉三角吗
那么要求的东西刚好就是同一层的杨辉三角的和
因为杨辉三角是求
(a±b)n−1的各项的系数,所以如果把它展开就是
(a±b)(a±b)...(a±b),所以系数和就是总的展开的项的个数 ( 没有合并 ) ,所以系数和就是
2n−1
或者,用另一种易懂的方法,就是展开后,我们让每一项的字母的乘积都为1,那么这个系数的总和就是这个式子的值,那么这样的话,
a,b就要等于1,系数和就是
2n−1
所以,只要求
2n−1 的值就可以了(绕了多大的弯啊)
那么,这样还是只有
80 分,所以,看一下这个模数
1152921504606846975,就是
260−1 所以,当
n=61 时,这个值又回到了当
n=1 的时候,所以这样就可以不用这么大的复杂度了
只需要求
2(n−1)%60的值就可以了
比如说我们想要求
623421%60 的值
10309
60
623421
60
23
0
234
180
54
0
542
540
21
然后如何实现呢?
- 输入6,k=6
- 输入2,k=62%60=2
- 输入3,k=23%60=23
- 输入4,k=234%60=54
- 输入2,k=542%60=2
- 输入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