基础分治

Posted xwww666666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础分治相关的知识,希望对你有一定的参考价值。

我真是个垃圾,滚回去刷普及组了

1>快速幂+模运算

#include<cstdio>
#include<cstdlib>
using namespace std;
long long a,b,k;

long long q_pow(long long x,long long y)

    int i=0;
    long long j=x,sum=1;
    while(y)
    
        if(y&(1<<i))
        
            y^=(1<<i);
            sum=sum*j%k;
        
        i++,j=j*j%k;
    
    return sum%k;//注意这里要写mod,因为如果b==0,则不会进入循环 


int main()

    scanf("%lld%lld%lld",&a,&b,&k);
    
    printf("%lld^%lld mod %lld=%lld",a,b,k,q_pow(a%k,b));
    
    return 0;

 

我好垃圾啊,水题随便一写就是一小时,难过

2>幂次方

分解成二进制数

#include<cstdio>
#include<cstdlib>
using namespace std;
int n;
int f[20001],lg[20001];
void pre()
    
    int i=1,j=0;
    while(i<20001)
    
        f[i]=j;
        i<<=1,j++;
    
    
    for(int i=2;i<20001;i++)
    
        lg[i]=lg[i-1];
        if(f[i]) lg[i]++;
    


void dfs(int x)

    if(x==1) printf("2(0)");
    else if(x==2) printf("2");
    else
    
        int i=lg[x];
        x^=(1<<i);
        
        printf("2");
        if(i>1) printf("("),dfs(i),printf(")");
        
        while(x && --i)
            if(x&(1<<i))
            
                printf("+");
            
                printf("2");
                if(i>1) printf("("),dfs(i),printf(")");
            
                x^=(1<<i);
            
        
        if(x) printf("+2(0)");
    


int main()

    scanf("%d",&n);
    
    pre();
    dfs(n);
    
    return 0;
 

3>CDQ求逆序对数

以上是关于基础分治的主要内容,如果未能解决你的问题,请参考以下文章

基础算法 分治法求最大最小元

基础算法 分治法之合并排序

动态点分治总结

$CDQ$分治总结

数据结构 8 基础排序算法详解快速排序的实现了解分治法

话谈——点分治