HDU 2817 快速幂取模
http://acm.hdu.edu.cn/showproblem.php?pid=2817
二分法,时间复杂度 O(logn)
用两个模版,非递归的用时少,但是不太理解。。。
好吧,等比数列又名几何数列 等差数列又名算术序列 arithmetic or geometric sequences
两个最基本公式:(A*B)%C = ((A%C)*(B%C))%C 和 (A+B)%C = ((A%C)+(B%C))%C
递归
// 15MS
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#define ll __int64 //这样定义长整型
#define MOD 200907
using namespace std;
int qmod(ll a,int n) //快速幂取模 递归模版
{
ll t;
if(n==0)return 1;
if(n==1)return a%MOD;
t=qmod(a,n/2);
t=(t*t)%MOD;
if(n&1) t=(t*(a%MOD))%MOD;
return t%MOD;
}
int main()
{
int CASE,k;
int ans;
ll a,b,c;
scanf("%d",&CASE);
while(CASE--)
{
scanf("%I64d%I64d%I64d%d",&a,&b,&c,&k);
if(b-a==c-b) ans=((a%MOD)+((k-1)%MOD)*((b-a)%MOD))%MOD;
else
{
ans=qmod(b/a,k-1);
ans=((a%MOD)*ans)%MOD;
}
printf("%d\n",ans);
}
return 0;
}
非递归
// 0MS #include<iostream> #include<cstdio> #include<cstring> #include<string> #define ll __int64 #define MOD 200907 using namespace std; ll qmod(ll x,ll n) //快速幂取模 非递归模版 { ll sum=1; while(n) { if(n&1){sum*=x;sum%=MOD;} x=(x*x)%MOD; n=n/2; } return sum; } int main() { int CASE,k; int ans; ll a,b,c; scanf("%d",&CASE); while(CASE--) { scanf("%I64d%I64d%I64d%d",&a,&b,&c,&k); if(b-a==c-b) ans=((a%MOD)+((k-1)%MOD)*((b-a)%MOD))%MOD; else { ans=qmod(b/a,k-1); ans=((a%MOD)*ans)%MOD; } printf("%d\n",ans); } return 0; }
想到了等比数列求和
就是提取公因式
求等比数列1+pi+pi^2+pi^3+...+pi^n可以由递归形式的二分求得:(模运算不能用等比数列和公式!)
若n为奇数,一共有偶数项,则:
1 + p + p^2 + p^3 +...+ p^n
= (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2) * (1+p^(n/2+1))
= (1 + p + p^2 +...+ p^(n/2)) * (1 + p^(n/2+1))
如:1 + p + p^2 + p^3 + p^4 + p^5 = (1 + p + p^2) * (1 + p^3)
若n为偶数,一共有奇数项,则:
1 + p + p^2 + p^3 +...+ p^n
= (1+p^(n/2+1)) + p * (1+p^(n/2+1)) +...+ p^(n/2-1) * (1+p^(n/2+1)) + p^(n/2)
= (1 + p + p^2 +...+ p^(n/2-1)) * (1+p^(n/2+1)) + p^(n/2);
如:1 + p + p^2 + p^3 + p^4 = (1 + p) * (1 + p^3) + p^2