等比数列求和
一、二分+快速幂
#include<bits/stdc++.h>
#define lom long long
using namespace std;
lom quick(lom a,lom b,lom c)//quick mod
{
lom ans=1;
a%=c;
while(b)
{
if(b&1) ans=ans*a%c;
a=a*a%c;
b>>=1;
}
return ans%c;
}
lom sum(lom a,lom b,lom p)
{// get the sum of the sequence of equal ratio numbers by bisection
if(b==0) return 1;
if(a==0) return 0;
if(b&1)
return ((1+quick(a,b/2+1,p)) * sum(a,b/2,p))%p;
else
return ((1+quick(a,b/2+1,p)) * sum(a,b/2-1,p) + quick(a,b/2,p))%p;
}
int main()
{
lom n,p,q;
while(cin>>q>>n>>p)
cout<<(sum(q,n,p)-1)%p<<endl;
return 0;
}
二、通项公式+逆元+快速幂
逆元:https://blog.csdn.net/qq_41431457/article/details/89813606
a/b(mod p) == a*b^(p-2) (mod p)
(1)如果 与p互质,直接逆元快速幂(默认 a1==q)
#include<bits/stdc++.h>
#define lom long long
using namespace std;
lom quick(lom a,lom b,lom c)//快速幂取模
{
lom ans=1;
a%=c;
while(b)
{
if(b&1) ans=ans*a%c;
a=a*a%c;
b>>=1;
}
return ans%c;
}
lom pi(lom a,lom b,lom p)
{
b=quick(b,p-2,p); //b的逆元
return a*b%p;
}
int main()
{
lom n,p,q;
while(cin>>q>>n>>p)
{
lom t=q*(quick(q,n,p)-1);
cout<<pi(t,q-1,p);
}
return 0;
}
(2)如果不互质 变换模值 (A/B)%P == (A%(P*B))/B%P
相关阅读
很多时候我们计算公司出入账或者一些考试学生分数时候,都需要用到求和,而且数据量大,不能直接口算,若是需要求和的位置较多,我们就可以
Excel软件依靠其强大的功能,成为一款快速、有效处理函数和公式的优秀软件。表格求和一直都是很多Office菜鸟不断询问的话题,对于刚
1. 等差数列求和公式2. 等比数列求和公式
excel求和公式是最简单的一种函数,那么excel求和公式怎么用呢?小编为大家整理了excel求和公式的使用方法,希望大家喜欢!excel求和公
microsoft office excel求和公式使用方法
在Excel中录入好数据以后经常需要统计数据,其中求和公式较为常用。具体该如何求和呢?接下来是seo实验室小编为大家带来的microsoft