[HNOI2008] [BZOJ1008] 越狱

Description

监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱

Input

输入两个整数M,N.1<=M<=10^8,1<=N<=10^12

Output

可能越狱的状态数,模100003取余

Sample Input

2 3

Sample Output

6

HINT

6种状态为(000)(001)(011)(100)(110)(111)

本题为一道组合数学的题目,本人是数学蒟蒻,看了题解后才明白。其实关键就是逆向思维。

n个房间 m种宗教,总状态数即m^n,若不越狱,即相邻房间的两个人宗教不同,所以第一个人有m种选择,则后面的每一个人都有m-1种选择,所以不越狱的状态总数我m*(m-1)^(n-1);所以越狱的状态数就为m^n-m*(m-1)^(n-1)。

解决了这个问题后,快速幂解决就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define mod 100003
#define ll long long
using namespace std;
ll m,n;
ll qpow(ll a,ll b)
{
    ll c=1,d=a%mod;
    while (b>0)
    {
        if (b&1)
         c=(c%mod*d%mod)%mod;
        b>>=1;
        d=(d%mod*d%mod)%mod;
    }
    return c;
}
int main()
{
    scanf("%lld%lld",&m,&n);
    long long ans=qpow(m,n);
    ans=ans-m*qpow(m-1,n-1)%mod;
    if (ans<0)   ans+=mod;
    printf("%lld",ans);
    return 0;
}
时间: 2024-10-27 11:43:43

[HNOI2008] [BZOJ1008] 越狱的相关文章

BZOJ_1008_[HNOI2008]_越狱_(简单组合数学+快速幂)

描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1008 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果 相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱. p.s.我真的没有企图概括的必要... 分析 所有情况是m^n,不可能发生越狱的情况是m*(m-1)^(n-1). 最后答案就是: m*(m^(n-1)-(m-1)^(n-1)).做个快速幂就好了. 注意: 1.

bzoj1008 越狱

Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 Input 输入两个整数M,N.1<=M<=10^8,1<=N<=10^12 Output 可能越狱的状态数,模100003取余 Sample Input 2 3 Sample Output 6 HINT 6种状态为(000)(001)(011)(100)(110)(111) 所有状态数

铁板铮铮♂+习题集

数论 快速幂 当b为偶数:ab=ab/2 * ab/2 当b为奇数:ab=ab/2 * ab/2 * a 核心代码: int quickpow(int a,int b) { int ret=1; for(;b;b>>=1)//如果b不等于0 b除2 { if(b&1)//b是奇数 ret=ret*a%n; a=a*a%n; } return ret; } 习题集 题目号 题目名 注释 洛谷P1965 [NOIP2013TG]转圈游戏 简单推导公式 洛谷P3197 [HNOI2008]越

[BZOJ1008] [HNOI2008] 越狱 (数学)

Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 Input 输入两个整数M,N.1<=M<=10^8,1<=N<=10^12 Output 可能越狱的状态数,模100003取余 Sample Input 2 3 Sample Output 6 HINT 6种状态为(000)(001)(011)(100)(110)(111) Source

BZOJ1008 HNOI2008 越狱 快速幂

题意:监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 题解:设f[i]=有M种宗教i个房间时不发生越狱的方案数,显然f[1]=M,f[i]=f[i-1]*(M-1).最后答案就是N^M-f[N] #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream

Bzoj1008 [HNOI2008]越狱

Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 7995  Solved: 3415 Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 Input 输入两个整数M,N.1<=M<=10^8,1<=N<=10^12 Output 可能越狱的状态数,模100003取余 Sample Input 2

[BZOJ1008][HNOI2008]越狱 组合数学

正着直接算有点难,我们考虑反着来,用全集减补集. 总的方案数为$m^n$.第一个人有$m$种可能,第二个人有$m-1$种可能,第三个人有$m-1$种可能--发现补集就是$m*(m-1)^{n-1}$.用快速幂搞搞就行了. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 typedef long long ll; 6 const int mod=10

BZOJ 1008: [HNOI2008]越狱 水

BZOJ难得的水题 1008: [HNOI2008]越狱 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 4977  Solved: 2149 [Submit][Status][Discuss] Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 Input 输入两个整数M,N.1<=M<=10^8,1&

BZOJ 1008: [HNOI2008]越狱 快速幂

1008: [HNOI2008]越狱 Description 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 Input 输入两个整数M,N.1<=M<=10^8,1<=N<=10^12 Output 可能越狱的状态数,模100003取余 Sample Input 2 3 Sample Output 6 HINT 6种状态为(000)(001)(011)(10