快速幂 jobdu-1447

原创 2016年08月31日 00:04:04

问题

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


版权声明:本文为博主原创文章,未经博主允许不得转载。

lintcode(140)快速幂

Description: 计算an % b,其中a,b和n都是32位的整数。 Explanation: 例如 231 % 3 = 2 例如 1001000 % 1000 =...
  • sunday0904
  • sunday0904
  • 2017年05月27日 19:26
  • 287

LintCode 快速幂

LintCode 快速幂计算ana^{n} % b ,其中a,b和n都是32位的整数。样例 例如 2312^{31} % 3 = 2例如 1001000100^{1000} % 1000 =...
  • shinanhualiu
  • shinanhualiu
  • 2015年12月21日 21:43
  • 1978

快速幂的简单解释

快速幂算法,顾名思义就是求幂时速度很快(废话 看了很多博客里的解释,都说得很玄奥……其实快速幂很容易解释的。 比如求3的20次幂,一般我们会用循环乘法来求,也就是需要循环20次。...
  • kencaber
  • kencaber
  • 2016年08月26日 16:00
  • 1113

【每日算法】快速幂

数值的整数次方实现函数double Power(double base, int n) 求base的n次方,不得使用库函数,同时不需要考虑大数问题。Tips问题本身很直观,但是越简单的题越需要细心思...
  • jiange_zh
  • jiange_zh
  • 2016年02月18日 11:50
  • 3400

快速幂+快速幂经典例题

快速幂取模算法所谓的快速幂,实际上是快速幂取模的缩写,简单的说,就是快速的求一个幂式的模(余)。在程序设计过程中,经常要去求一些大数对于某个数的余数,为了得到更快、计算范围更大的算法,产生了快速幂取模...
  • zhhe0101
  • zhhe0101
  • 2016年10月15日 10:59
  • 1273

快速幂算法代码

快速幂,O(log(b)) 留着用
  • GuoZLH
  • GuoZLH
  • 2016年02月01日 00:58
  • 346

ACM模板——快速幂

//From Baidu. 快速幂 int PowerMod(int a, int b, int c) { int ans = 1; a = a % c; while(b>0)...
  • Kiritow
  • Kiritow
  • 2016年08月03日 12:33
  • 193

快速幂乘 Java实现

题目出自山东理工ACM :小明的数学题 Problem Description 题目是这样子的,有一个整数a(-2^31...
  • qq_28333903
  • qq_28333903
  • 2017年01月15日 06:34
  • 189

优秀而强行的十进制快速幂

十进制快速幂 & 快速幂
  • scar_lyw
  • scar_lyw
  • 2017年04月14日 10:40
  • 612

POJ 1001 高精度实数相乘与快速幂

题目链接:http://poj.org/problem?id=1001 题意:
  • r131303
  • r131303
  • 2014年05月09日 20:56
  • 874
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:快速幂 jobdu-1447
举报原因:
原因补充:

(最多只允许输入30个字)