链接:https://ac.nowcoder.com/acm/challenge/terminal来源:牛客网 kotori最近迷上了摆气球的游戏。她一共有n种气球,每种气球有无数个。她要拿出若干

牛客网一战到底题,有点小意思,估计很多人不知道为什么有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种选择,所以总排列数就是n*(n-1)^{m-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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值