等比数列和的快速求法
等比数列是一种常用的数列
朴素的求和方法是直接每项相加,不会影响取模,代码也很简单,但是时间复杂度为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
等比数列和的快速求法相关推荐
- 2019河北省大学生程序设计竞赛(重现赛)B 题 -Icebound and Sequence ( 等比数列求和的快速幂取模)...
题目链接:https://ac.nowcoder.com/acm/contest/903/B 题意: 给你 q,n,p,求 q1+q2+...+qn 的和 模 p. 思路:一开始不会做,后面查了下发现 ...
- CodeForces Round #191 (327C) - Magic Five 等比数列求和的快速幂取模
很久以前做过此类问题..就因为太久了..这题想了很久想不出..卡在推出等比的求和公式,有除法运算,无法快速幂取模... 看到了 http://blog.csdn.net/yangshuolll/art ...
- 等比数列求和 (快速幂 + 逆元)
求一个等比数例之和, 并让他对一个数取模. 用到等比数列求和公式, 快速幂, 逆元. 不会证明, 下面给出代码. #include <stdio.h> #include <strin ...
- 【微积分/高等数学】无穷级数 之 和函数的快速求法(九阴真经)
本笔记资料中的方法是考研数学王谱老师的"九阴真经",对于求和函数的题可快速解决. 现将笔记分享出来,也方便自己翻阅笔记. 前言 此类题目的出题方式一般为给出无穷级数,要求写出和函数 ...
- 中位数(第k大数)快速求法
本文为twenz根据个人经验整理,转载请注明来源,谢谢! 中位数即为一系列数中的大小在中间位置的数,快速找中位数的有效方法有: 1.排序法:先对数组进行排序,时间复杂度为O(nlogn),然后选择中间 ...
- 题35.C++练习-3-3快速幂 等比数列求和
文章目录 题35.C++练习-3-3快速幂 等比数列求和 一.题目 二.题解 题35.C++练习-3-3快速幂 等比数列求和 一.题目 二.题解 本题若使用等比数列求和公式+快速幂当然会因为幂结果数据 ...
- c语言的幂乘积表达式,POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]
大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有且只有一种方式写出其素因子的乘积表达式. ,其中 为素数 2) 约数和 ...
- 矩阵快速幂+构造方法
与快速幂一样,可以将递推式通过二进制的方式来进行优化,这个学了快速幂就是十分容易理解 大概的板子如下: struct mat///自己定义大小的矩阵 {ll m[11][11]; }; mat mul ...
- 矩阵快速幂(教主传授)
教主传授 快速幂的思想: 假设我们要求a^b,最朴素的方法就是不断地乘a,乘b次,复杂度O(b). 如果b很大,10^9,就需要用快速幂的思想. 例:a=3,b=100: 100的二进制为:11001 ...
最新文章
- 一段处理百分数的js代码
- 时区切换导致quartz定时任务没有触发问题
- ASIC开发设计流程
- 【pmcaff】看看人家的办公室 天天加班都愿意
- SAP Spartacus ConfigModule.withConfig的处理逻辑
- JS重新来过之------------[String对象]
- 三角灯箱 css_如何使用HTML,CSS和JavaScript创建灯箱
- 随想录(移动app下的生活)
- 向Spark的DataFrame增加一列数据
- Series 入门(创建和增删改查)
- HDU 2063 过山车
- 关于C#编译器错误CS0685(VS2005)
- 再分享一个零成本做文库代下载赚钱项目
- 2020年中国海洋大学夏令营记录
- js中使用jQuery读/写cookie的值
- [Unity][NGUI]Sprite精灵的Type九宫格切割Sliced没效果
- 大一期末C语言大作业—结构体和链表框架
- IE浏览器一打开就提示“已停止工作”的解决方案
- jQuery UI框架
- Excel使用技巧之如何修改CSV文件的分隔符
热门文章
- Michael-Scott非阻塞队列(lock-free)算法的C实现
- Delphi项目的构成(Files That Make Up a Delphi Project)
- 第二十一章流 14临时文件
- BIOS INT 10-13功能调用的“另类”玩法
- vim E492: Not an editor command: ^M
- 中国3大移动公司(电信,联通,移动)频率分配大全(GSM,CDMA,CDMA2000,WCDMA,TD-SCDMA,LTE TD,FDD)
- android 源码各版本下载 原生纯净版
- 【Q】之Linux中的防火墙netfilter iptables
- 1746: 多项式系数(杨辉三角的应用)
- 技术解读|云上企业级存储——打开存储新维度,促进用户核心业务创新