首页 > 其他分享 >等比数列二分求和

等比数列二分求和

时间:2023-05-31 17:34:32浏览次数:42  
标签:二分 等比数列 Matrix 求和 LL int return include cur


今天我们学习如何有效地求表达式

等比数列二分求和_ios

的值。对于这个问题,用二分解决比较好。


(1)

等比数列二分求和_i++_02

时,

等比数列二分求和_#include_03

(2)

等比数列二分求和_#include_04

时,那么有    

等比数列二分求和_i++_05

(3)

等比数列二分求和_#include_06

时,那么有   

等比数列二分求和_ios_07


代码:

#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

 

题意:矩阵求和

等比数列二分求和_ios_08

 

代码:

#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;
}

 

标签:二分,等比数列,Matrix,求和,LL,int,return,include,cur
From: https://blog.51cto.com/u_16146153/6388635

相关文章

  • 二分查找
    我们知道二分查找的基础写法有三种:左闭右闭区间publicstaticintbinsearch(int[]nums,inttarget){intl=0,r=nums.length-1;while(l<=r){intm=(l+r)/2;if(nums[m]==target)returnm;......
  • 二分法应用——搜索旋转数组,以前一直在纠结a[0],a[-1],a[mid], target三者关系,其实最
    62·搜索旋转排序数组  描述给定一个有序数组,但是数组以某个元素作为支点进行了旋转(比如,0124567可能成为4567012)。给定一个目标值target进行搜索,如果在数组中找到目标值返回数组中的索引位置,否则返回-1。你可以假设数组中不存在重复的元素。背完这套刷题模板,真......
  • Gym - 100851L [二分+线性推导]
    题目链接:https://vjudge.net/problem/Gym-100851L 解题思路:根据题目知道,墙的两边是不能放石头的,所以最终的结果肯定会收到两边墙的限制,从而使得答案不会超过1e9+1e5。此外我们再去二分最大高度,一个明显的结论就是以i为最高点建墙的话最少花费肯定是建一个金字塔形的墙面。但由于......
  • poj 2452(RMQ+二分)
    解题思路:这题实际上就是求某区间上的最值问题,可以先枚举区间的起始位置,然后二分去搜索比起始位置大的数且位置最远(这里可以用RMQ算法区间内的最小值),找到之后再利用RMQ算法找这段区间内的最大的,如果这段区间的长度比当前的最优值大,那么更新。详细的见代码。#include<iostream>#incl......
  • POJ 1505(二分+贪心)
    题意:给一些书,这些书有不同的页数,让把这些书分成k份,必须是连续的,问这些份中页数和的最大值最小是多少。解题思路:知道了页数和的范围,而且书都是连续的,要找到页数和最大值的最小值可以直接二分答案。。AC:#include<iostream>#include<cstdlib>#include<cstring>usingnamespacestd......
  • 2018ACM浙江省赛 ZOJ 4029 Now Loading!!!(二分)
    NowLoading!!!TimeLimit: 1Second     MemoryLimit: 131072KBDreamGridhas  integers .DreamGridalsohas foragivennumber ,where , .InputTherearemultipletestcases.Thefirstlineofinputisaninteger Thefirstlinecon......
  • 算法学习-二分查找
    题目:C.PlaceforaSelfieCodeforcesRound862(Div.2)题目链接:Problem-C-Codeforces题目描述: 有若干抛物线(抛物线方程为a*x2+b*x+c,每条抛物线的a,b,c值给出)和经过原点,斜率不同的直线(斜率值k给出)。对于每条抛物线找出任意一条直线,它与该抛物线不相交。题目......
  • 对数组的元素求和
    packagecom.karl1;publicclassArrayTest{publicstaticvoidmain(String[]args){//对数组的元素求和//定义一个数组int[]money={16,26,36,6,100};//定义一个变量用于累加求和intsum=0;//遍历这个数组中的每一个数据for(inti=0;i<money.length;i++)......
  • 【LeetCode】704.二分查找
    704.二分查找解析:思路一:暴力解法,直接遍历,从头开始查找,如果找到直接返回下标,找不到返回-1。classSolution{public:intsearch(vector<int>&nums,inttarget){for(inti=0;i<nums.size();i++){if(nums[i]==target)......
  • 二分图和 2-SAT 问题入门
    二分图定义通俗的说,就是一个图可以分成两个部分,两个部分内部没有连接的边,所有的边都在两个部分之间。比如这就是一张二分图。可以发现,A,B集合中各自是没有边连接的,边都连在了AB集合之间。并且4是独立的,所以其实我们把它归到集合A中或者集合B中都可以。判断二分图就......