算法竞赛进阶指南-位运算

作者: 球球球球笨 | 来源:发表于2019-10-21 14:11 被阅读0次

很久没更新简书了,今日回归,要是还有小伙伴能看见,请监督我,我越来越菜了QAQ!

  1. a^b
    题目链接https://ac.nowcoder.com/acm/contest/996/A
    快速幂裸题。
#include<iostream>
using namespace std;

int main() {
    long long a, b, p;
    cin>>a>>b>>p;
    long long res = 1 % p;
    a %= p;
    while(b) {
        if(b & 1) res = (res * a) % p;
        a = (a * a)%p;
        b >>= 1;
    }
    cout<< res<<endl;
    return 0;
}
  1. 64位整数乘法
    题目链接https://ac.nowcoder.com/acm/contest/996/C
    快速幂变形。
#include<iostream>
using namespace std;

int main() {
    long long a,b,p;
    cin>>a>>b>>p;
    long long res = 0 % p;
    while(b) {
        if(b & 1) res = (res + a) % p;
        a = (a%p + a%p) % p;
        b >>= 1;
    }
    cout<<res<<endl;
    return 0;
}
  1. 最短Hamilton距离
    题目链接https://ac.nowcoder.com/acm/contest/996/D
    状压dp
    dp[1<<20][N]
    其中第一维代表的是状态,哪些点已经遍历过,每一位的0或者1代表当前点是否被遍历。
    第二维代表当前遍历过程中,走到了哪个点。
    dp状态转移公式:
    dp[state][j] = dp[state_k][k] + weight[k][j] , state_k = state 除掉j之后的集合,其中 state_k要包含k。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N = 20,M = 1 <<20;
int n;
int dp[M][N],weight[N][N];

int main() {
    cin >> n;
    for(int i = 0; i < n; i++) {
        for(int j = 0;j < n;j++) {
            cin>>weight[i][j];
        }
    }
    memset(dp,0x3f,sizeof dp);
    dp[1][0] = 0;
    for(int i = 0;i < 1<<n;i++) {
        for(int j = 0; j < n; j++) {
            if(i >> j & 1) { // 判断当前状态是否可以停在j点
                for(int k = 0; k < n;k++) {
                    if((i - (1<<j)) >> k & 1) { // 判断当前状态去除j之后,是否包含k
                        dp[i][j] = min(dp[i][j], dp[i-(1<<j)][k] + weight[k][j]);
                    }
                }
            }
        }
    }
    cout<<dp[(1<<n) - 1][n-1]<<endl;
    return 0;
}

  1. lowbit实现
int lowbit1(int n) {
     return (~n + 1) & n;
}

int lowbit2(int n) {
     return (-n) & n;
}

相关文章

  • 算法竞赛进阶指南-位运算

    很久没更新简书了,今日回归,要是还有小伙伴能看见,请监督我,我越来越菜了QAQ! a^b题目链接https://a...

  • 学习路线规划

    目前有两本书,《算法竞赛入门经典》和《算法竞赛进阶指南》。根据书名应该先看《算法竞赛入门经典》( 《算法竞赛入门经...

  • 《算法竞赛进阶指南》0x01 位运算(笔记)

    位运算 快速幂取模 快速乘取模 哈夫曼路径 用异或来求配对的数 把数字从0,1开始两两配对,(0, 1), (2,...

  • 《算法竞赛入门经典训练指南》PDF高清完整版-免费下载

    《算法竞赛入门经典训练指南》PDF高清完整版-免费下载 《算法竞赛入门经典训练指南》PDF高清完整版-免费下载 下...

  • 《算法竞赛入门经典训练指南》PDF高清完整版-免费下载

    《算法竞赛入门经典训练指南》PDF高清完整版-免费下载 《算法竞赛入门经典训练指南》PDF高清完整版-免费下载 下...

  • 面试知识汇总-2019.7.16

    手撕代码题: 其他数据结构与算法中有那些奇技淫巧位运算装逼指南 ---- 带你领略位运算的魅力 单项列表实现加法运...

  • 递归、回溯、分治

    递归 (1)子集 方式一:递归算法 方式二:位运算算法 (2)子集II 方法一:递归算法 方法二:位运算 (3)组...

  • 位运算指南

    1、判断奇偶数普通方法: 实际上 n % 2 的形式,编译器也会自动帮我们优化成位运算所以可直接使用位运算 2、交...

  • 位运算 算法

    位运算 算法 -1.与: &或: |非: !异或 : ^ 相同为 0, 不同为 1int 32 位 -> int ...

  • 【进阶】位运算简介

    导言:在脚本中位运算通常用于调用 Windows API 时或某些特殊场合中。这里位运算中的位是指二进制位,所以位...

网友评论

    本文标题:算法竞赛进阶指南-位运算

    本文链接:https://www.haomeiwen.com/subject/gdhtvctx.html