对于数列S(n) = a + a^2 + a^3 +....+ a^n;

可以用二分的思想进行下列的优化。

if(n & 1)

  S(n) = a + a^2 + a^3 + ....... + a^n;

  = a + a^2 + a^3 +..+ a^((n-1) / 2) + a^((n-1) / 2 + 1) + a^((n-1) / 2 + 2) + ... + a^((n-1) / 2 + (n-1) / 2) + a^((n-1) / 2 + (n-1) / 2 + 1);

  = (1 + a^((n-1) / 2 + 1)) * S((n-1)/2) + a^((n-1) / 2 + 1)

else

  S(n) = a + a^2 + a^3 + ....... + a^n;

  = a + a^2 + a^3 +..+ a^((n / 2) + a^(n / 2 + 1) + a^(n / 2 + 2) + ... + a^(n/ 2 + n / 2);

  = (1 + a^(n / 2)) * S(n / 2);

这样就可以避免矩阵的除法了! 还有就是MOD真的很慢。

#include<map>
#include<set>
#include<string>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<time.h>
#include<cstring>
#include<iostream>
#include<algorithm>
#define INF 1000000001
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int MAXN = ;
struct Mat
{
ll a[][];
}E;
int n,k,MOD;
Mat Matadd(Mat a,Mat b)
{
Mat c;
for(int i = ; i < n; i++){
for(int j = ; j < n; j++){
c.a[i][j] = (a.a[i][j] + b.a[i][j])%MOD;
}
}
return c;
}
Mat Matmul(Mat a,Mat b)
{
Mat c;
for(int i = ; i < n; i++){
for(int j = ; j < n; j++){
c.a[i][j] = ;
for(int k = ; k < n; k++){
c.a[i][j] += (a.a[i][k] * b.a[k][j])%MOD;
}
c.a[i][j] %= MOD;
}
}
return c;
}
Mat power(Mat a,int n)
{
Mat c;
c = E;
while(n){
if(n & ){
c = Matmul(c,a);
}
a = Matmul(a,a);
n >>= ;
}
return c;
}
Mat sum(Mat a,int k)//求S(k)
{
if(k == )return a;
Mat t = sum(a,k/);//S(k/2)
if(k & ){
Mat cur = power(a,k/ + );//a^(k/2 + 1)
t = Matadd(t,Matmul(t,cur));//(1 + a^(k/2+1))*S(k/2)
t = Matadd(t,cur);//(1 + a^(k/2 + 1))*S(k/2)
}
else {
Mat cur = power(a,k/);//a^(k/2)
t = Matadd(t,Matmul(t,cur));//(1 + a^(k/2))*S(k/2)
}
return t;
}
int main()
{
while(scanf("%d%d%d",&n,&k,&MOD) != EOF){
Mat a;
memset(E.a,,sizeof(E.a));
for(int i = ; i < n; i++)E.a[i][i] = ;
for(int i = ; i < n; i++){
for(int j = ; j < n; j++){
scanf("%lld",&a.a[i][j]);
a.a[i][j] %= MOD;
}
}
Mat ans = sum(a,k);
for(int i = ; i < n; i++){
for(int j = ; j < n; j++){
if(j == )printf("%lld",ans.a[i][j]);
else {
printf(" %lld",ans.a[i][j]);
}
}
printf("\n");
}
}
return ;
}

poj3233 矩阵等比数列求和 二分的更多相关文章

  1. HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)

    HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意:  g(i)=k*i+b;i为变量.  给出 ...

  2. HDU 2254 奥运(矩阵高速幂+二分等比序列求和)

    HDU 2254 奥运(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 2254 奥运 题意:  中问题不解释. 分析:  依据floyd的算法,矩阵的k次方表示这个矩阵走了k步.  所以k ...

  3. POJ 1845 (约数和+二分等比数列求和)

    题目链接: http://poj.org/problem?id=1845 题目大意:A^B的所有约数和,mod 9901. 解题思路: ①整数唯一分解定理: 一个整数A一定能被分成:A=(P1^K1) ...

  4. luogu1397 [NOI2013]矩阵游戏 (等比数列求和)

    一个比较显然的等比数列求和,但有一点问题就是n和m巨大.. 考虑到他们是在幂次上出现,所以可以模上P-1(费马小定理) 但是a或c等于1的时候,不能用等比数列求和公式,这时候就要乘n和m,又要变成模P ...

  5. hoj3152-Dice 等比数列求和取模

    http://acm.hit.edu.cn/hoj/problem/view?id=3152 Dice My Tags (Edit) Source : Time limit : sec Memory ...

  6. Codeforces 963A Alternating Sum(等比数列求和+逆元+快速幂)

    题目链接:http://codeforces.com/problemset/problem/963/A 题目大意:就是给了你n,a,b和一段长度为k的只有'+'和‘-’字符串,保证n+1被k整除,让你 ...

  7. bzoj 4555 [Tjoi2016&Heoi2016]求和 NTT 第二类斯特林数 等比数列求和优化

    [Tjoi2016&Heoi2016]求和 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 679  Solved: 534[Submit][S ...

  8. ZOJ-3774 Power of Fibonacci——等比数列求和&&等价替换

    题目 求 $\displaystyle \sum_{i=1}^n F_i^k$,($1 \leq n\leq 10^{18},1 \leq  k\leq 10^5$),答案对 $10^9+9$ 取模. ...

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

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

随机推荐

  1. Google Play笔记之上架

    我最近负责Google Play上架的主要工作 ,现已进入开放测试阶段(随后就可全球首发~~).接入工作已完成,这篇记录一下上架后期的笔记. 开放测试 开放测试是指对所有玩家进行开放式测试,玩家可以通 ...

  2. ubuntu14上安装ros教程

    安装ROS 官方的安装教程地址 http://wiki.ros.org/cn/jade/Installation/Ubuntu 建议安装indigo版的 下面的教程是安装jade版的 配置Ubuntu ...

  3. Hibernate之组件映射

    1:为什么要使用组件映射 答:建立关系数据模型的一个重要原则是在不会导致数据冗余的前提下,尽可能减少数据库表的数目及表之间的外键参照关系.以员工信息为例,员工信息中有员工的家庭地址信息,如果把地址信息 ...

  4. http协议(六)报文首部

    http请求和响应报文内容比较多,会分为大概四部分更新,最近比较忙,没太多时间整理- - 首先来看看报文结构吧 1.http请求报文 http请求报文由方法.URI.http版本.http首部字段等构 ...

  5. memcache分布式 [一致性hash算法] 的php实现

    最近在看一些分布式方面的文章,所以就用php实现一致性hash来练练手,以前一般用的是最原始的hash取模做分布式,当生产过程中添加或删除一台memcache都会造成数据的全部失效,一致性hash就是 ...

  6. AI图片剪切

    来源:http://tieba.baidu.com/p/1203332701?pid=14163166977&cid=78618096662&from=prin#78618096662 ...

  7. poj 3255 Roadblocks

    Roadblocks Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13216 Accepted: 4660 Descripti ...

  8. 005商城项目:ssm框架的整合成功之后的问题:使用maven的tomcat插件时的debug

    在执行maven的clean时经常碰到一个问题: 解决: 然后: 还有一个问题是:用maven 使用Debug调试时,不能看到源代码. 解决办法: 下面选择Debug Configurations 这 ...

  9. 047医疗项目-模块四:采购单模块—采购单审核提交(Dao,Service,Action三层)

    我们之前把采购单都审核了,这篇文章说的就是审核之后提交. 其实就是改变(update)采购单的审核状态. 需求: 用户要先查看采购单的内容. 查看采购单页面:页面布局同采购单修改页面. 选择审核结果. ...

  10. javascript:查找“跳号”号码

    业务背景:航空货运系统中,“货运代理商”会定期从“航空公司”领取一定数量的纸质运单(每张纸上有一个单号),这些单号都是连续的(即:每次可以理解为领取一个“号段”),而且每张单子都要向航空公司交纳一定的 ...