快速幂
------------------------------题目来源51Nod - 1046
给出3个正整数A B C,求A^B Mod C。
例如,3 5 8,3^5 Mod 8 = 3。
Input
3个正整数A B C,中间用空格分隔。(1 <= A,B,C <= 10^9)
Output
输出计算结果
Sample Input
3 5 8
Sample Output
3
ac代码:
#include<iostream>
using namespace std;
typedef long long ll;
ll qmi(ll m, ll k, ll p)
{
ll res = 1 % p;
while (k)
{
if (k&1) res = res * m % p;
m = m * m % p;
k >>= 1;
}
return res;
}
int main()
{
ll a,b,c;cin>>a>>b>>c;
cout<<qmi(a,b,c)<<endl;
return 0;
}
矩阵快速幂
--------------题目来源洛谷
题目背景
矩阵快速幂
题目描述
给定 n×n 的矩阵 A,求 A^k 。
输入格式
第一行两个整数 n,k 接下来 n 行,每行 n 个整数,第 i行的第 j的数表示 A i,j 。
输出格式
输出 A^k
共 n 行,每行 n 个数,第 i行第 j个数表示 Ai,j,每个元素对 10^9+7取模。
输入输出样例
输入 #1复制
2 1
1 1
1 1
输出 #1复制
1 1
1 1
说明/提示
【数据范围】
对于 100% 的数据:1≤n≤100,0≤k≤10^12 , |Ai,j| <= 1000
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 110;
const ll mod = 1e9+7;
int n;
ll bb;
void put(ll a[][N]){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
printf("%lld ",a[i][j]);
}
printf("\n");
}
}
void fun( ll a[][N], ll b[][N]){
ll c[N][N];
memset( c, 0,sizeof c);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
c[i][j]+=a[i][k]*b[k][j]%mod;
c[i][j]%=mod;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
a[i][j]=c[i][j];
}
}
}
void qmi(ll a[][N]){
ll ans[N][N]={0};
for(int i=1;i<=n;i++){
ans[i][i]=1;
}
while(bb){
if(bb&1)
fun(ans,a);
bb>>=1;
fun(a,a);
}
put(ans);
}
int main()
{
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
scanf("%d%lld",&n,&bb);
ll ay[N][N];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
scanf("%lld",&ay[i][j]);
}
}
if(bb==0){
put(ay);
return 0;
}
qmi(ay);
return 0;
}