快速幂 jobdu-1447


问题

看下面的问题: [ 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值