洛谷刷题 快速幂-[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;
}
相关推荐
万事可爱^31 分钟前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
黑不溜秋的32 分钟前
C++ 设计模式 - 策略模式
c++·设计模式·策略模式
李白同学1 小时前
【C语言】结构体内存对齐问题
c语言·开发语言
欧了1112 小时前
洛谷P9240 [蓝桥杯 2023 省 B] 冶炼金属
职场和发展·蓝桥杯·洛谷·蓝桥杯大学b组c语言
黑子哥呢?2 小时前
安装Bash completion解决tab不能补全问题
开发语言·bash
青龙小码农2 小时前
yum报错:bash: /usr/bin/yum: /usr/bin/python: 坏的解释器:没有那个文件或目录
开发语言·python·bash·liunx
大数据追光猿2 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!3 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
夏末秋也凉3 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
南宫生3 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode