求x^0+x^1+x^2+.......x^n mod p; x,n,p<=10^9

方法一:快速幂。但是肯定还是超时。

方法二:利用等比数列公式,但是有除法,做不下去了。

方法三:有点分治的味道..

n为偶数时,x^0+x^1+x^2+.......x^n=(x^0+x^1+x^2+.....x^(n/2))*(1+x^(n/2))-x^(n/2);也就是F(n)=F(n/2)*(1+x^(n/2))-x^(n/2);

n为奇数时,x^0+x^1+x^2+.......x^n=(x^0+x^1+x^2+.....x^(n/2))*(1+x^(n/2))-x^(n/2)+x^n;也就是F(n)=F(n/2)*(1+x^(n/2))-x^(n/2)+x^n;

用快速幂计算单个的,n的规模每次递归可以减半。。

仅仅是自己的想法,欢迎指出错误,或者提出更好的方法。

经过试验,减法也是满足同余的,也就是a%p-b%p+p)%p==(a-b)%p。

求x^0+x^1+x^2+.......x^n mod p; x,n,p<=10^9,布布扣,bubuko.com

时间: 2024-07-30 20:32:23

求x^0+x^1+x^2+.......x^n mod p; x,n,p<=10^9的相关文章

Java循环练习:求1+(1+2)+(1+2+3)+(1+2+3+4)+...(1+2+3+..+10)的和

package practiceGO; /*  * 2.求1+(1+2)+(1+2+3)+(1+2+3+4)+...(1+2+3+..+10)的和   */ public class Cto { public static void main(String[] args) { int sum = 0; for(int i=0; i<10; i++){ int adds = 0; for(int j=0; j<(i+1); j++){ adds += j+1; } sum += adds; }

hud5451_求循环节加矩阵快速幂

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5451 题目描述: 对于,给出x和mod,求y向下取整后取余mod的值为多少? 找循环节解析链接:http://blog.csdn.net/ACdreamers/article/details/25616461 裸题链接:http://blog.csdn.net/chenzhenyu123456/article/details/48529039 1 #include <algorithm> 2 #i

: 求靠谱灭蟑螂的方法

发信人: clos (古尔丹之颅), 信区: Occupier标  题: Re: 求靠谱灭蟑螂的方法发信站: 水木社区 (Tue May 19 10:19:32 2015), 站内  请上京东,搜索拜乐.  非常好用,一个南方的同事推荐给我的,使用后基本见不到蟑螂了,亲测有效.-- 发信人: moonriver000 (moonriver000), 信区: Occupier标  题: Re: 求靠谱灭蟑螂的方法发信站: 水木社区 (Tue May 19 10:54:10 2015), 站内  粘

6.组函数(avg(),sum(),max(),min(),count())、多行函数,分组数据(group by,求各部门的平均工资),分组过滤(having和where),sql优化

 1组函数 avg(),sum(),max(),min(),count()案例: selectavg(sal),sum(sal),max(sal),min(sal),count(sal) from emp / 截图: 2 组函数和null在一起 案例:求员工的平均奖金 错误sql: select avg(comm) 方式1,sum(comm)/count(comm)方式2,sum(comm)/count(*) 方式3 from emp; 截图: 错误原因: select count(comm

欧几里德算法(求两个正整数的最大公约数)

/*欧几里德算法:辗转求余  原理: gcd(a,b)=gcd(b,a mod b)  当b为0时,两数的最大公约数即为a getchar()会接受前一个scanf的回车符*/ #include<stdio.h> void main(){    int temp;    int a,b;    scanf("%d",&a);    scanf("%d",&b);    printf("the greatest common fa

疯狂的O2O快活不下去 抱大腿跪求免死

光靠把钱当柴火烧,就能成功,那也就没BAT什么事了,名列世界五百强的众多中国银行岂不是更该"文成武德.一统江湖"吗! 文/张书乐 2015年对于O2O创业者来说是悲壮的一年.在过去的10个月里,数以千计的O2O们,已经光荣了,而哪怕是社区001.顺丰嘿客.叮咚小区之类的大户,也在生死边缘上垂死挣扎,怎么才能活下去?一些社区O2O们纷纷祭出抱粗腿招数,跪求免死. 抱团.抱风投.抱不来免死金牌 10月8日,美团和大众点评联合发布声明,正式宣布达成战略合作,双方已共同成立一家新公司.这在当下

求A^B的所有约数和 POJ1845

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 6 using namespace std; 7 8 long long arr1[100000]; 9 long long MOD=9901; 10 11 long long multi(long long a,long long b) 12 { 13 if(b==0) 14 return

[zz]求一维序列的信息熵(香浓熵)的matlab程序实例

对于一个二维信号,比如灰度图像,灰度值的范围是0-255,因此只要根据像素灰度值(0-255)出现的概率,就可以计算出信息熵.    但是,对于一个一维信号,比如说心电信号,数据值的范围并不是确定的,不会是(0-255)这么确定,如果进行域值变换,使其转换到一个整数范围的话,就会丢失数据,请高手指点,怎么计算. 比如数字信号是x(n),n=1~N(1)先用Hist函数对x(n)的赋值范围进行分块,比如赋值范围在0~10的对应第      一块,10~20的第二块,以此类推.这之前需要对x(n)做

利用指针求最值

#include <iostream>using namespace std;int getmaxormin(int *arr,int count,bool isMax) {      int temp=arr[0];    for(int i=1;i<count;i++)     {        if(isMax)         {              if(temp<arr[i])temp=arr[i];         }        else         {