等比数列是一种常用的数列

朴素的求和方法是直接每项相加,不会影响取模,代码也很简单,但是时间复杂度为o(n),难以令人满意

于是我们想到了通项公式

我们知道,等比数列和前n项和公式为(a1-a1*q^n)/(1-q).

而通过二分计算快速幂可以在log(n)的时间计算出q^n的值,(代码如下)。剩下的貌似就是简单的除法了

int pow2( int a, int b )
{int r = 1, base = a;while( b != 0 ){if( b % 2 )r = (r*base)%mod;base =( base*base)%mod;b /= 2;}return r;
}

不过事情没这么简单。

由于等比数列增加很快,很多题目中我们需要对它进行取模,而通项公式中有除法,不能直接取模,于是我们需要使用数论中讲到的模逆元素

 在数论中,若 (a/x) %p= ( a *y%p) 我们称y为x模p的逆元素

逆元素存在条件为gcd(x,p)=1;

有结论为,若y为x模p的逆元素,则x*y%p=1.

即x*y与1关于p同余

因此我们可以使用exgcd求得x模p的逆元素exgcd(x,p,&y,&z);

得到一个y,若y为负,调整为正数

求得了x的逆元素,我们就可以通过

(a1*pow(q,n)-1)*y%mod 得到等比数列(a1,q)的前n项和了。

** 9.8日补充:

若取模的P非质数,那么gcd(x,p)不一定等于1,此时无法通过exgcd求逆元

取模时还有一个备选公式可以使用:

(A/B)%C=(A%(B*C))/B (A%B = 0);

不过要注意b*c可能会溢出,适用范围不大

应用:hdu1452 -----求 2004^x(mod 29)

参考资料 http://blog.csdn.net/luyuncheng/article/details/8017016

ac代码:

#include<stdio.h>
#include<algorithm>
using namespace std;
#define MAX 200000000
#define ull unsigned long long
const int MAXN = 100011;
int pow2( int a, int b )
{int r = 1, base = a;while( b != 0 ){if( b % 2 )r = (r*base)%29;base =( base*base)%29;b /= 2;}return r;
}int main(){int x;while(scanf("%d",&x)&&x){int a=pow2(2,2*x+1);int b=pow2(3,x+1);int c=pow2(22,x+1);printf("%d\n",( a - 1 ) * (( b - 1 ) * 15) * ( c - 1 ) * 18 % 29);}return 0;
}

转载于:https://www.cnblogs.com/lnever/p/3933747.html

等比数列和的快速求法相关推荐

  1. 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)...

    题目链接:https://ac.nowcoder.com/acm/contest/903/B 题意: 给你 q,n,p,求 q1+q2+...+qn 的和 模 p. 思路:一开始不会做,后面查了下发现 ...

  2. CodeForces Round #191 (327C) - Magic Five 等比数列求和的快速幂取模

    很久以前做过此类问题..就因为太久了..这题想了很久想不出..卡在推出等比的求和公式,有除法运算,无法快速幂取模... 看到了 http://blog.csdn.net/yangshuolll/art ...

  3. 等比数列求和 (快速幂 + 逆元)

    求一个等比数例之和, 并让他对一个数取模. 用到等比数列求和公式, 快速幂, 逆元. 不会证明, 下面给出代码. #include <stdio.h> #include <strin ...

  4. 【微积分/高等数学】无穷级数 之 和函数的快速求法(九阴真经)

    本笔记资料中的方法是考研数学王谱老师的"九阴真经",对于求和函数的题可快速解决. 现将笔记分享出来,也方便自己翻阅笔记. 前言 此类题目的出题方式一般为给出无穷级数,要求写出和函数 ...

  5. 中位数(第k大数)快速求法

    本文为twenz根据个人经验整理,转载请注明来源,谢谢! 中位数即为一系列数中的大小在中间位置的数,快速找中位数的有效方法有: 1.排序法:先对数组进行排序,时间复杂度为O(nlogn),然后选择中间 ...

  6. 题35.C++练习-3-3快速幂 等比数列求和

    文章目录 题35.C++练习-3-3快速幂 等比数列求和 一.题目 二.题解 题35.C++练习-3-3快速幂 等比数列求和 一.题目 二.题解 本题若使用等比数列求和公式+快速幂当然会因为幂结果数据 ...

  7. c语言的幂乘积表达式,POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]

    大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式. ,其中 为素数 2) 约数和 ...

  8. 矩阵快速幂+构造方法

    与快速幂一样,可以将递推式通过二进制的方式来进行优化,这个学了快速幂就是十分容易理解 大概的板子如下: struct mat///自己定义大小的矩阵 {ll m[11][11]; }; mat mul ...

  9. 矩阵快速幂(教主传授)

    教主传授 快速幂的思想: 假设我们要求a^b,最朴素的方法就是不断地乘a,乘b次,复杂度O(b). 如果b很大,10^9,就需要用快速幂的思想. 例:a=3,b=100: 100的二进制为:11001 ...

最新文章

  1. 一段处理百分数的js代码
  2. 时区切换导致quartz定时任务没有触发问题
  3. ASIC开发设计流程
  4. 【pmcaff】看看人家的办公室 天天加班都愿意
  5. SAP Spartacus ConfigModule.withConfig的处理逻辑
  6. JS重新来过之------------[String对象]
  7. 三角灯箱 css_如何使用HTML,CSS和JavaScript创建灯箱
  8. 随想录(移动app下的生活)
  9. 向Spark的DataFrame增加一列数据
  10. Series 入门(创建和增删改查)
  11. HDU 2063 过山车
  12. 关于C#编译器错误CS0685(VS2005)
  13. 再分享一个零成本做文库代下载赚钱项目
  14. 2020年中国海洋大学夏令营记录
  15. js中使用jQuery读/写cookie的值
  16. [Unity][NGUI]Sprite精灵的Type九宫格切割Sliced没效果
  17. 大一期末C语言大作业—结构体和链表框架
  18. IE浏览器一打开就提示“已停止工作”的解决方案
  19. jQuery UI框架
  20. Excel使用技巧之如何修改CSV文件的分隔符

热门文章

  1. Michael-Scott非阻塞队列(lock-free)算法的C实现
  2. Delphi项目的构成(Files That Make Up a Delphi Project)
  3. 第二十一章流 14临时文件
  4. BIOS INT 10-13功能调用的“另类”玩法
  5. vim E492: Not an editor command: ^M
  6. 中国3大移动公司(电信,联通,移动)频率分配大全(GSM,CDMA,CDMA2000,WCDMA,TD-SCDMA,LTE TD,FDD)
  7. android 源码各版本下载 原生纯净版
  8. 【Q】之Linux中的防火墙netfilter iptables
  9. 1746: 多项式系数(杨辉三角的应用)
  10. 技术解读|云上企业级存储——打开存储新维度,促进用户核心业务创新