主要还是 快速幂取模 ,快速幂很少碰到
快速幂(位运算)
typedef long long ll;
ll fast_pow(ll a,ll b)//a^b
{
ll ans=1;
while(b){
if(b&1)
ans*=a;
b>>=1;
a*=a;
}
return ans;
}
n^n的末位数字
给出一个整数N,输出N^N(N的N次方)的十进制表示的末位数字。
Input
一个数N(1 <= N <= 10^9)
Output
输出N^N的末位数字
Sample Input
13
Sample Output
3
也可以用快速幂配合取模,也就是快速幂取模, 因为数据比较大,只要求输出末尾数字,所以对10进行快速幂取模
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll fast_mod(ll a,ll b,ll mod)//a^b % 10
{
ll ans=1;
while(b){
if(b&1)
ans=ans*a%mod;
b>>=1;
a=a*a%mod;
}
return ans;
}
int main()
{
ll x;
while(cin>>x){
cout<<fast_mod(x,x,10)<<endl;
}
return 0;
}
快速幂取模(位运算) 快速幂详解
如果n=2^k ,可以将其表示为 x^n=((x²)²)······
typedef long long ll;
ll fast_mod(ll a,ll b,ll mod)
{
ll ans=1;
while(b){
if(b&1)
ans=ans*a%mod;
b>>=1;
a=a*a%mod;// 不断的两两合并再取模,减小a和b的规模
}
return ans;
}
N的阶乘 mod P
输入N和P(P为质数),求N! Mod P = ? (Mod 就是求模 %)
例如:n = 10, P = 11,10! = 3628800
3628800 % 11 = 10
Input
两个数N,P,中间用空格隔开。(N < 10000, P < 10^9)
Output
输出N! mod P的结果。
Sample Input
10 11
Sample Output
10
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll fast_pow(ll n,ll p)
{
ll ans=1;
for(ll i=1;i<=n;i++)
ans=ans*i%p;
return ans;
}
int main()
{
ll n,p;
cin>>n>>p;
cout<<fast_pow(n,p)<<endl;
return 0;
}