题目描述
监狱有n个房间,每个房间关押一个犯人,有m种宗教,每个犯人会信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。
答案对100,003取模。
输入格式
输入只有一行两个整数,分别代表宗教数 m和房间数n。
输出格式
输出一行一个整数代表答案。
样例 #1
样例输入 #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 ≤10^8, 1 ≤n ≤10^{12}, 0 < k < {10}^9。
错误代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int m,n;
int f(int a,int b){if(b==0) return 1;if(b==1) return a;int t=f(a,b/2)%100003;t=t*t%100003;return t*f(a,b%2)%100003;
}
signed main() {cin >> m >> n;cout<<(f(m,n)-m*f((m-1),(n-1)))%100003; return 0;
}
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int m,n;
int f(int a,int b){if(b==0) return 1;if(b==1) return a%100003;int t=f(a,b/2)%100003;t=t*t%100003;return t*f(a,b%2)%100003;
}
signed main() {cin >> m >> n;cout<<(f(m,n)-m*f(m-1,n-1)%100003+100003)%100003; return 0;
}