看完这个之后,感觉数学简直太厉害了 转载自:http://blog.csdn.net/acdreamers/article/details/7851144

今天我们学习如何有效地求表达式的值。对于这个问题,用二分解决比较好。

(1)时,

(2)时,那么有

(3)时,那么有

代码:

 
#include <iostream>
#include <string.h>
#include <stdio.h> using namespace std;
const int M = 1000000007;
typedef long long LL; LL power(LL a,LL b)
{
LL ans = 1;
a %= M;
while(b)
{
if(b & 1)
{
ans = ans * a % M;
b--;
}
b >>= 1;
a = a * a % M;
}
return ans;
} LL sum(LL a,LL n)
{
if(n == 1) return a;
LL t = sum(a,n/2);
if(n & 1)
{
LL cur = power(a,n/2+1);
t = (t + t * cur % M) % M;
t = (t + cur) % M;
}
else
{
LL cur = power(a,n/2);
t = (t + t * cur % M) % M;
}
return t;
} int main()
{
LL a,n;
while(cin>>a>>n)
cout<<sum(a,n)<<endl;
return 0;
}

  

题目:http://poj.org/problem?id=3233

题意:矩阵求和

代码:

#include <iostream>
#include <string.h>
#include <stdio.h> using namespace std;
const int N = 35; struct Matrix
{
int m[N][N];
}; Matrix I;
int n,k,M; Matrix add(Matrix a,Matrix b)
{
Matrix c;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
c.m[i][j] = a.m[i][j] + b.m[i][j];
c.m[i][j] %= M;
}
}
return c;
} Matrix multi(Matrix a,Matrix b)
{
Matrix c;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
c.m[i][j] = 0;
for(int k=0; k<n; k++)
c.m[i][j] += a.m[i][k] * b.m[k][j];
c.m[i][j] %= M;
}
}
return c;
} Matrix power(Matrix A,int n)
{
Matrix ans = I,p = A;
while(n)
{
if(n & 1)
{
ans = multi(ans,p);
n--;
}
n >>= 1;
p = multi(p,p);
}
return ans;
} Matrix sum(Matrix A,int k)
{
if(k == 1) return A;
Matrix t = sum(A,k/2);
if(k & 1)
{
Matrix cur = power(A,k/2+1);
t = add(t,multi(t,cur));
t = add(t,cur);
}
else
{
Matrix cur = power(A,k/2);
t = add(t,multi(t,cur));
}
return t;
} int main()
{
while(scanf("%d%d%d",&n,&k,&M)!=EOF)
{
Matrix A;
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
scanf("%d",&A.m[i][j]);
A.m[i][j] %= M;
I.m[i][j] = (i==j);
}
}
Matrix ans = sum(A,k);
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
printf("%d ",ans.m[i][j]);
puts("");
}
}
return 0;
}

等比数列二分求和(logn复杂度)的更多相关文章

  1. HDU1588-Gauss Fibonacci(矩阵高速幂+等比数列二分求和)

    题目链接 题意:g(x) = k * x + b.f(x) 为Fibonacci数列.求f(g(x)),从x = 1到n的数字之和sum.并对m取模. 思路:  设A = |(1, 1),(1, 0) ...

  2. 【POJ1845】Sumdiv(数论/约数和定理/等比数列二分求和)

    题目: POJ1845 分析: 首先用线性筛把\(A\)分解质因数,得到: \[A=p_1^{a_1}*p_2^{a_2}...*p_n^{a_n} (p_i是质数且a_i>0) \] 则显然\ ...

  3. SPOJ AMR10E Stocks Prediction --二分求和+矩阵快速幂

    题意:给一个递推式S(n) = a1*S(n-1)+...+aR*S(n-R),要求S(k)+S(2k)+...+S(nk)的值. 分析:看到n的大小和递推式,容易想到矩阵快速幂.但是如何转化呢? 首 ...

  4. POJ - 3233 Matrix Power Series (矩阵等比二分求和)

    Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + - + Ak. ...

  5. POJ 3233 Matrix Power Series 矩阵快速幂+二分求和

    矩阵快速幂,请参照模板 http://www.cnblogs.com/pach/p/5978475.html 直接sum=A+A2+A3...+Ak这样累加肯定会超时,但是 sum=A+A2+...+ ...

  6. [ACM] POJ 3233 Matrix Power Series (求矩阵A+A^2+A^3...+A^k,二分求和或者矩阵转化)

    Matrix Power Series Time Limit: 3000MS   Memory Limit: 131072K Total Submissions: 15417   Accepted:  ...

  7. POJ 1845 Sumdiv [素数分解 快速幂取模 二分求和等比数列]

    传送门:http://poj.org/problem?id=1845 大致题意: 求A^B的所有约数(即因子)之和,并对其取模 9901再输出. 解题基础: 1) 整数的唯一分解定理: 任意正整数都有 ...

  8. POJ 1845 Sumdiv(因子分解+快速幂+二分求和)

    题意:给你A,B,让求A^B所有的因子和模上9901 思路:A可以拆成素因子的乘积: A = p1^x1 * p2^x2 *...* pn^xn 那么A^B = p1^(B*x1) * p2^(B*x ...

  9. 对O(logN)复杂度的推导

    之前一直对O(logN)这个复杂度如何推导出的存在疑问,这段时间看了一些算法相关的内容,正好看到这个问题,大略研究了一下算是基本解答了我的疑惑:现记录如下 假设有一棵高为H的满二叉树,则它的节点共有N ...

随机推荐

  1. MathType怎么打定积分竖线

    MathType怎么打定积分竖线-MathType中文官网 http://www.mathtype.cn/jiqiao/dingjifen-shuxian.html 输入公式后在分隔符模板中选择左竖线 ...

  2. Page6:关于能控性、能观性、能测性及其判据(1)[Linear System Theory]

    内容包含能控性和能测性的定义,连续时间线性时不变系统能控性和能观测性判据

  3. [knowledge][http] http

    关于,底层承载协议的规定. HTTP communication usually takes place over TCP/IP connections. The [], but other port ...

  4. Delphi2010分 AnsiChar(1个字节) 和WideChar(2个字节) 。D7都是AnsiChar。

    Delphi2010分 AnsiChar(1个字节) 和WideChar(2个字节) .D7都是AnsiChar.

  5. Servlet (二)ServletContext

    package cn.sasa.serv; import java.io.IOException; import javax.servlet.ServletContext; import javax. ...

  6. jquery中$.get()提交和$.post()提交的区别

    相同点:都是异步请求的方式来获取服务器端的数据: 异同点: 1.请求方式不同:$.get()方法使用 GET 方法来进行异步请求的:$.post()方法使用POST方法来进行异步请求的: 2.参数传递 ...

  7. 什么是HDFS

    HDFS是什么:HDFS即Hadoop分布式文件系统(Hadoop Distributed Filesystem),以流式数据访问模式来存储超大文件,运行于商用硬件集群上,是管理网络中跨多台计算机存储 ...

  8. 批量删除以及将String数组转换成Integer数组的奇淫技巧

    首先在pom.xml文件添加依赖: <!-- bean工具 --> <dependency> <groupId>commons-beanutils</grou ...

  9. python创建有序字典及字典按照值的大小进行排序

    有序字典 在Python中,字典类型里面的元素默认是无序的,但是我们也可以通过collections模块创建有序字典 # -*- coding:utf-8 -*- # python有序字典需导入模块c ...

  10. jmeter报错:内存溢出

    使用jmeter进行压力测试时,经常会遇到内存溢出错误: 2018-08-28 09:01:26,686 ERROR o.a.j.JMeter: Uncaught exception: java.la ...