快速幂 jobdu-1447

来源:互联网 发布:国家去库存政策 知乎 编辑:程序博客网 时间:2024/04/28 02:46

问题

看下面的问题: [ jobdu-1442]

题目描述:
Xinlv wrote some sequences on the paper a long time ago, they might be arithmetic or geometric sequences. The numbers are not very clear now, and only the first three numbers of each sequence are recognizable. Xinlv wants to know some numbers in these sequences, and he needs your help.
输入:
The first line contains an integer N, indicting that there are N sequences. Each of the following N lines contain four integers. The first three indicating the first three numbers of the sequence, and the last one is K, indicating that we want to know the K-th numbers of the sequence.
You can assume 0 < K <= 10^9, and the other three numbers are in the range [0, 2^63). All the numbers of the sequences are integers. And the sequences are non-decreasing.
输出:
Output one line for each test case, that is, the K-th number module (%) 200907.
样例输入:
2
1 2 3 5
1 2 4 5
样例输出:
5
16

思路

基本题,思路并不难。
要用到快速幂。
有一个要注意的点,中间过程有益处的可能性。小心!

代码

#include <iostream>typedef long long ll;ll arr[3];const int MOD = 200907;int fast_pow( ll a, ll b, int mod );int main( void ){    int t = 0;    std::cin >> t;    while( t-- )    {        for( int i = 0; i < 3; ++i )            std::cin >> arr[i];        int k = 0;        std::cin >> k;        int ans = 0;        if( arr[0] - arr[1] == arr[1] - arr[2] )        {            ans = (arr[0]%MOD + ((k-1)%MOD * (arr[1] - arr[0])%MOD)%MOD)%MOD;        }        else        {            ans = (arr[0]%MOD * fast_pow(arr[1]/arr[0], k-1, MOD))%MOD;        }        std::cout << ans << std::endl;    }    return 0;}int fast_pow( ll a, ll b, int mod ){    int ans = 1;    ll w = a;// 这里小心,如果不是ll。可能 w%mod * w%mod这里就溢出了    while(b)    {        if(b%2)            ans = (ans * w)%mod;        w = (w%mod * w%mod)%mod;        b /=2 ;    }    return ans;}

总结

改bug的时候如果感觉没有思路,哪怕不明确。但是有一点感觉就先试试,先把问题解决了再说。本体题目提示了数据范围较大,但是还是没有找到具体哪个过程的溢出。不妨先试试,找一个可能的方向。先把问题及时解决了,在回过头了看。


0 0