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

  

posted @ 2012-10-04 00:00  快乐.  阅读(215)  评论(0编辑  收藏  举报