[アルゴリズム] - 高速かつ消費電力の最適化アルゴリズム

通常の累乗アルゴリズム

例で見てみましょうHDU 2035

かわいいA ^ B

タイトル説明

^ Bの整数表現の最後の3桁の数字を求めています。
説明:A ^ B "はA、Bのパワー"の意味であります

入力

テストケースは、複数の各インスタンスに対して1つの列を含む入力データは、2つの正整数AとB(1 <= A、B <= 10000)は、A = 0の場合、B = 0は、入力データの終わりを意味します処理なし。

出力

各テストケースのために、最後の3つの出力A ^ B整数表現、行当たりそれぞれ出力します。

サンプルIutput

2 3
12 6
6789 10000
0

サンプル出力

8
984
1

問題解決のアイデア:最もシンプルなアイデアが得られたデータについて話して、最後の3桁の数字を取得した1000年の残りの部分を取るべきである、我々はすべてのそれの指数爆発の概念を聞いた、その結果は、爆発的な成長の指標として増加し、6789う10000電源さえlong long型は、数式のセットを導入するために私達の下に、高く維持されます

  1. (+ b)は%C =((%のC)+(B%C))%のC
  2. A * B%C =((%のC)*(B%のC))%のC
  3. %C = B /(( %のC)/(Bの%のC))は、C%
    、我々はそれによってデータのサイズを低減する、各因子のための操作を法とすることができる
    C言語コード次
#include <stdio.h>

long long quit(long long x, long long y)
{
    long long  ans = 1;
    for(int i = 1; i <= y; i++)
    {
        ans *= x;
        ans = ans%1000;
    }
    return ans%1000;
}
int main(void)
{
    long long a, b, ans;
    while(~scanf("%lld%lld", &a, &b))
    {
        if(a == 0 && b == 0) break;
        ans = quit(a, b);
        printf("%d\n", ans);
    }
    return 0;
}

通常の累乗アルゴリズムの時間計算量はO(n)は、我々は必要な2 10億の最後の3桁の数字を見つけたい時間が非常に長くなります

クイックパワーアルゴリズムとは何ですか

高速電力アルゴリズムの話すインデックス核となるアイデアは減少し、ベースの増加は、サイクル数が削減されます
私たちは栗を見て

^ 2 = 9 2 。8 * @ 2ベースケース2
= 4 4 *ベースケース2 // 4
= 16 2 * @ 2ベースケース16
= 256 。1 * @ 2ベースケース256は
2見ることができる。9つの塩基で結果指数が奇数製品の全てに等しい場合

ここでは、コードのショーを使用します!

long long fastPower(long long base, long long power)
{
    long long ans = 1;
    while(power > 0)
    {
        if(power % 2 == 0)//如果指数为偶数
        {
            power /= 2;//把指数缩小一半
            base = base * base % 1000;//底数平方
        }
        else
        {
            power--;//指数减一
            power /= 2;//把指数缩小一半
            ans *= base % 1000;//指数为奇数时的积
            base = base * base % 1000;//底数平方
        }
    }
    return ans;
}

高速電力最適化アルゴリズム

long long fastPower(long long base, long long power)
{
    long long ans = 1;
    while(power > 0)
    {
        if(power % 2 == 1)
        {
            ans *= base % 1000;
        }
        power /= 2;
        base *= base % 1000;
    }
    return ans;
}

最終的な最適化

最後のビットが1であれば我々は最後の1つが、その数が奇数である、バイナリで、パワー&1、%2 == 1&1には、より高速な電源に置き換え、この操作は、「ビット演算」と呼ばれている電力を供給することができます最後の一つは偶数であり、結果は偶数0 'であれば、この時1&計算で、奇数ならば、結果は、1であり、0であり
、コードが

long long fastPower(long long base, long long power)
{
    long long ans = 1;
    while(power > 0)
    {
        if(power&1)
        {
            ans *= base % 1000;
        }
        power /= 2;
        base *= base % 1000;
    }
    return ans;
}

この記事リファレンス:https://blog.csdn.net/qq_19782019/article/details/85621386

(個人的な使用のための学習)

公開された20元の記事 ウォンの賞賛2 ビュー945

おすすめ

転載: blog.csdn.net/zhbbbbbb/article/details/103429600