洛谷刷题 快速幂-[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;
}
相关推荐
Sarvartha2 小时前
final 关键字
java·开发语言
fpcc2 小时前
c++编程实践—堆和栈越界调试
c++
yi0112 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
程序员Sunday2 小时前
JavaScript 事件循环面试题,宏任务与微任务怎么执行|Sunday面试指南
开发语言·javascript·面试·校招·事件循环·程序员sunday
zhangzeyuaaa3 小时前
Ruby 多线程、GVL(GIL)与 Mutex 完全指南
开发语言·前端·ruby
weiabc3 小时前
MSYS2 UCRT64 + g++ C++ 中文输出乱码 完整全过程
c++
谢亮_vipxieliang4 小时前
用 PHP 构建轻量级 REST API:从路由到鉴权的完整实践
开发语言·后端·php
思无邪664 小时前
用 AI 做 JS 逆向:从抓包到复现的完整方法论
开发语言·javascript·人工智能
灯澜忆梦4 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
小蒋观天下5 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型