洛谷刷题 快速幂-[P3197]越狱(C++)

题目描述

监狱有 n 个房间,每个房间关押一个犯人,有 m 种宗教,每个犯人会信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。

答案对 100,003 取模。

输入格式

输入只有一行两个整数,分别代表宗教数 m 和房间数 n。

输出格式

输出一行一个整数代表答案。

输入输出样例

样例输入 #1

复制代码
2 3

样例输出 #1

复制代码
6

提示

样例输入输出 1 解释

| 状态编号 | 1 号房间 | 2 号房间 | 3 号房间 |

| :--------: | :--------: | :-------: | :--------: |

| 1 | 信仰 1 | 信仰 1 | 信仰 1 |

| 2 | 信仰 1 | 信仰 1 | 信仰 2 |

| 3 | 信仰 1 | 信仰 2 | 信仰 2 |

| 4 | 信仰 2 | 信仰 1 | 信仰 1 |

| 5 | 信仰 2 | 信仰 2 | 信仰 2 |

| 6 | 信仰 2 | 信仰 2 | 信仰 1 |

数据规模与约定

对于 100% 的数据,保证1≤m≤1e8,1≤n≤1e12。

知识点:快速幂、组合数学、容斥

代码

cpp 复制代码
#include<bits/stdc++.h> 
using namespace std;
typedef long long ll;
const ll N=1e5+5;
const ll mod=100003;
ll temp1,temp2,ans;
ll qmi(ll a, ll k, ll p)
{
    ll res=1;//res为每一步得到的结果 
    while(k)
    {
        if(k&1)
		{
			res=(res*a)%p;//a就是a^(2^k) 
		}
        a=(a*a)%p;//每次平方 
        k>>=1;
    }
    return res;
}
int main()
{
	ll m,n;
	cin>>m>>n;
	temp1=qmi(m,n,mod);
	temp2=qmi(m-1,n-1,mod);
	temp2=(m%mod)*temp2%mod;
	ans=temp1-temp2;
	if(ans<0)
	{
		ans+=mod;
	}
	ans%=mod;
	cout<<ans<<endl; 
    return 0;
}
相关推荐
林一百二十八13 小时前
Python实现手写数字识别
开发语言·python
小小鱼儿飞13 小时前
QT Quick QML项目音乐播放器16----无边框窗口拖动、小窗播放、隐藏系统托盘
开发语言·qt
陌路2013 小时前
S12 简单排序算法--冒泡 选择 直接插入 希尔排序
数据结构·算法·排序算法
-指短琴长-13 小时前
Qt的下载和安装【Windows】
开发语言·windows·qt
不会编程的小寒13 小时前
C++ this指针、常函数、内联函数
java·开发语言
小冯的编程学习之路13 小时前
【C++】:C++基于微服务的即时通讯系统(2)
开发语言·c++·微服务
许长安13 小时前
C/C++中的extern关键字详解
c语言·开发语言·c++·经验分享·笔记
雾岛—听风14 小时前
P1012 [NOIP 1998 提高组] 拼数
算法
papership14 小时前
【入门级-算法-5、数值处理算法:高精度的乘法】
数据结构·算法
earthzhang202114 小时前
【1039】判断数正负
开发语言·数据结构·c++·算法·青少年编程