2017.8.10

来源:互联网 发布:人活着的意义知乎 编辑:程序博客网 时间:2024/05/22 07:01

今天开始学习分治了!!!!!!!   离梦想又近了一步!!!


分治   顾名思义  “分而治之”  就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

采用分治法解决的问题一般具有的特征如下:
1. 问题的规模缩小到一定的规模就可以较容易地解决。
2. 问题可以分解为若干个规模较小的模式相同的子问题,即该问题具有最优子结构性质。
3. 合并问题分解出的子问题的解可以得到问题的解。
4. 问题所分解出的各个子问题之间是独立的,即子问题之间不存在公共的子问题。

设计步骤

编辑
1. 划分步:把输入的问题划分为k个子问题,并尽量使这k个子问题的规模大致相同。
2. 治理步:当问题的规模大于某个预定的阀值n0时,治理步由k个递归调用组成。
3. 组合步:组合步把各个子问题的解组合起来,它对分治算法的实际性能至关重要,算法的有效性很大地依赖于组合步的实现。
分治法的关键是算法的组合步。究竟应该怎样合并,目前没有统一的模式,因此需要对具体问题进行具体分析,以得出比较好的合并算法。

luogu1226    取余运算||快速幂

题目描述

输入b,p,k的值,求b^p mod k的值。其中b,p,k*k为长整型数。

输入输出格式

输入格式:

三个整数b,p,k.

输出格式:

输出“b^p mod k=s”

s为运算结果

拿到这道题时我用暴力算法骗了83 分  最后i一个数据 TLE了   看来只能用 分治了

分治思想:众所周知 平方的运行是很快的   我们就要把数据换成平方
例如 a^16=a^8的平方  而a^8又是a^4的平方  a^4又是a^2的平方……
当遇到奇数时   如 a^5=a^2的平方*a……
另外,本题 b^p会很大,所以,我们在求幂的过程中,要不停的取余数,遵循的一个数学原理,叫同余原理。  a*b%k=(a%k)*(b%k)%k,这样才能在计算中不会让数据溢出,避免了高精度运算。



代码附下:
#include<bits/stdc++.h>
using namespace std;
long long ans=1;
long long b,p,k;
void work()
{


    int temp=p, s=b;
while(temp!=0)
{
if (temp%2==1)  ans=ans*s%k; 
        temp/=2;  
        s=s*s%k; 
}
  }


int main()
{


cin>>b>>p>>k;
cout<<b<<"^"<<p<<" "<<"mod"<<" "<<k<<"=";
b%=k;
work();
cout<<ans;
    return 0;
   }


原创粉丝点击