牛客网一战到底题,有点小意思,估计很多人不知道为什么有60%的案例过不了。
原题链接:https://ac.nowcoder.com/acm/challenge/terminal
题目及说明:
题目描述
kotori最近迷上了摆气球的游戏。她一共有n种气球,每种气球有无数个。她要拿出若干个气球摆成一排。
但是,由于气球被施放了魔法,同样种类的气球如果相邻会发生爆炸,因此若两个相邻的气球种类相同被视为不合法的。
kotori想知道,摆成一排m个一共有多少种不同的方案?
由于该数可能过大,只需要输出其对109取模的结果。
输入描述:
输入仅有一行,为两个整数n和m(1≤n,m≤100)
输出描述:
输出一个整数,为方案数对109取模的结果。
示例1
输入
复制3 2
3 2
输出
复制6
6
说明
假设3种气球标记为1、2、3,那么共有以下6种方案:[1,2] [1,3] [2,1] [2,3] [3,1] [3,2]。
解题思路
思路挺简单,总共n种气球,每种气球不限量,求m个气球的排列组合数。
由此第一个气球总有n种选择,其后每个气球都有且只有n-1种选择,所以总排列数就是
代码很好写,首先想到的肯定这样来:
#include <iostream>
using namespace std;
int main(){
int x1,x2,s;
cin>>x1>>x2;
s=x1--;
for(;x2>1;x2--){
s*=x1;
}
cout<<s%109;
}
so easy!感觉也就这样嘛,不过如此!
一提交却是60%案例答案错误........
这个找问题应该也不难,你就可大的输入两个数,比如来个10的n次方和100(因为n没限制,m却最大为100),输出答案一看为负,甚至不输出也该想到了,结果太大了.....32位的int存不下。
解决起来也简单,加一行代码就行,像这样:
#include <iostream>
using namespace std;
int main(){
int x1,x2,s;
cin>>x1>>x2;
s=x1--;
for(;x2>1;x2--){
s*=x1;
s=s%109;
}
cout<<s%109;
}
至于原理我写个式子大家应该就懂了:
(120*x)%109 = ((109+11)*x)%109 = (109*x+11*x)%109 = (11*x)%109