zoukankan      html  css  js  c++  java
  • 模幂算法

    //
    //712的n次方,结果后三位为696,满足这个条件的n的个数为多少?(0  < n < 24767)
    //这是一个典型的模幂算法问题,下面证明 : (a * b) % n = [(a % n) * (b % n)] % n  (把*换成 + 也成立)
    // 设 a = k1*n + r1, b = k2*n + r2,
    // 于是有 :
    //(a * b) % n = (k1*k2*n*n + k1 * r2 * n + k2 * r1 * n + r1 * r2) % n = (r1 * r2) % n = [(a % n) * (b % n)] % n.
    //根据上面证明有(a^b) % n = ((a%n) * (a ^ (b - 1)) % n) % n          ==696;
    //下面给出模幂运算的递归和非递归代码:
    #include<iostream>
    using namespace std;

    int getMod1(int a, int b, int n) //712*712*712*712*712*712*712*712。。。。。 a^b%n
    {
    if (0 == b)
    return 1;
    return (a % n * getMod1(a, b - 1, n)) % n;
    }

    int getMod2(int a, int b, int n) // a:712 b:712的次方数 n:1000,模n后剩余后三位数字
    {
    int i, r = 1;
    for (i = 1; i <= b; i++)
    {
    r = ((r % n) * (a % n)) % n;
    }
    return r;
    }

    int main()
    {
    int a = 3;
    int b = 4;
    int n = 5;
    cout << getMod1(a, b, n) << endl; //81%5=1
    cout << getMod2(a, b, n) << endl;

    int i, r, sum = 0;
    a = 712;
    n = 1000;
    r = 696;
    for (i = 1; i < 24767; i++)
    if (r == getMod2(a, i, n))
    sum++;
    cout << sum << endl;

    return 0;
    }

  • 相关阅读:
    自己用的,存储代码
    ASCII编码表
    全球最热门编程语言20种
    C++中二维数组new小结
    字符,字节和编码
    让工资涨的快的小技巧
    Ip Messenger
    xajax中文手册
    BitmapFile Formats(BMP文件的格式)
    python中返回字符串中指定字符的索引
  • 原文地址:https://www.cnblogs.com/xcb-1024day/p/11334804.html
Copyright © 2011-2022 走看看