zoukankan      html  css  js  c++  java
  • 算法进阶:0x01 位运算

    一、快速幂的模板代码 a^b%p

    #include<iostream>
    using namespace std;
    int main()
    {
        int a,b,p;
        cin>>a>>b>>p;
        int res = 1 % p;
        while (b)
        {
            if (b & 1) res = res * 1ll * a % p;
            b >>= 1;
            a = a * 1ll * a % p;
        }
        cout<<res<<endl;
    }

    注意点:

    1、转换成long long类型可以直接乘1ll,作用与(long long)相同,范围大概为10^19,int为2 147 483 647。

    2、以2^7为例,7 = 4(2^2) + 2(2^1) + 1(2^0);二进制形式为111,b&1为获取最后一位是否为1,b>>=1舍弃最后一位。

    3、如果测试数据为123456789 0 1,res=1没有%p的话,那么结果就是1,正确应为0,所以应该初始化res就%p,res = 1 % p。

     4、memset(a, val, sizeof(a))把数值val(0x00~0xFF)填充到数组a的每个字节上,一个int占用4个字节,所以用memset只能赋值出“每8位都相同”的int。0x3F3F3F3F(1 061 109 567)的两倍不超过0x7F7F7F7F(2 147 483 647),memset(a, 0x3F, sizeof(a))。0xFFFFFFFF为-1。

    二、如果a, b, p范围是10^18,求a*b%p

    1、那么为了不超过范围,首先得用usigned long long,2*10^19。乘法转化为加法,a^b = a * a * …… * a。a * b = a + a + ……+a。

    a * 1 = 2^0 * a,

    a * 2 = 2^1 * a,

    a * 4 = 2^2 * a,

    a * 8 = 2^3 * a, 

    a * 2^k = 2^k * a。

    一共k+1次,k为logb级别。

    #include<iostream>
    using namespace std;
    typedef unsigned long long ULL;
    int main()
    {
        ULL a,b,p;
        cin>>a>>b>>p;
        ULL res = 0;
        while (b)
        {
            if (b & 1) res = (res + a) % p;
            b >>= 1;
            a = a * 2 % p;
        }
        cout<<res<<endl;
    }

    最短Hamilton路径:

     

     

     

     

  • 相关阅读:
    Distinctive Image Features from ScaleInvariant
    Natural Language Toolkit
    Regression analysis
    泌尿系统 Excretory system
    file_get_contents preg_match php nameisboy
    wWAITING
    instructionset architecture Processor Architecture
    improve performance whilemaintaining the functionality of a simpler and more abstract model design of processor hardware
    cluster analysis in data mining
    Maximum Likelihood
  • 原文地址:https://www.cnblogs.com/longxue1991/p/12376613.html
Copyright © 2011-2022 走看看