ACM训练半周总结—10月26

来源:互联网 发布:上海雨人软件 编辑:程序博客网 时间:2024/05/29 02:33

         这个半周主要还是在看博客,另外还试着做了下题,,,到现在还没做出来。整理下吧。。

         快速幂乘取模(a^b%c)

         其中利用将b逐步按照二进制分解,a^b%c,当b比较大时可将其分解 。当b为偶数时,a^b%c=(a^(b/2)*a^(b/2))%c;当b为奇数时,a^b%c=(a^(b/2)*a^(b/2)*a)%c。

         这个可以解决当幂次特别大时。贴下模版吧

         http://www.aiuxian.com/article/p-2262690.html这是大佬的模版

#define LL __int64LL m;//计算a*b % m,将b按二进制分解LL FaMulti(LL a, LL b){    LL res = 0;    while(b)    {        if(b & 1)        {            res += a;            res %= m;        }        a += a;        a %= m;        b >>= 1;    }    return res;}// 计算a^b % m,将b按二进制分解LL FaPow(LL a, LL b){    LL res = 1;    while(b)    {        if(b & 1)        {            res = FaMulti(res, a);        }        a = FaMulti(a, a);        b >>= 1;    }    return res;}
     矩阵求快速幂
     这个方法上面的类似都是利用结合律将其二分化,和整数一样,矩阵也可以有乘积(每一行乘每一列),
这是转载的大佬的模版http://www.aiuxian.com/article/p-2262668.html
Mat pow(Mat a, int k){    Mat c;    int i, j;    c = Mat();    c.n = a.n;    c.m = a.n;    for(i=1; i<=a.n; ++i)  // 初始化为单位矩阵        c.mat[i][i] = 1;    while(k)    {         if(k & 1)          // 二进制位为1则执行            c = c*a;        a = a*a;        k >>= 1;    }    return c;}

     暂时还没A的题,题意:s=(1^1)+(2^2)+....(n^n),给出n,输出s的个位数。
     这道题可以发现,两数相乘个位上的数都是成规律变化,像2的就是,2,4,8,6,2,4,8,6,,打表,输出相应位上得数就可以了,
     看似很简单的题隐藏着一个巨坑,1<=n<=2*10^100,没留意就交了两发,全Re,估计要整成字符串输入,利用大数除法和取模算出来吧,待会一定要A
     出来。
    

原创粉丝点击