• 【9701】求余运算


    Time Limit: 3 second
    Memory Limit: 2 MB

    【问题描述】

        输入b,p,k的值,求bp mod k的值。其中b、p、k*k为长整形数。

    【输入格式】

        1行。先后为b、p、k的值,中间用空格隔开

    【输出格式】

        仅1行。b^p mod k的结果值(mod的前后有一个空格,等号前后无空格)

    【输入样例】

        2 10 9

    【输出样例】

        2^10 mod 9=7

    【题解】

    首先得知道一个原理

    就是 a * b mod k == (a % k) * (b %k) mod k;

    但是b上面的指数p可能太大了。这样算的话可能会超时。

    所以要用到快速幂。

    介绍一下快速幂

    eg:2^17

    我们首先把17/2->8;

    然后8/2 = 4

    4/2 = 2

    2/2 =1

    1/2 = 0;

    然后组合成((((2^0*2 )^2)^2)^2)^2*2。

    这样看可能有点复杂。可以看下这个程序的过程

    a最初为1

    void kk (int x)

    {
    if (x == 0) return;

    kk( x /2)

    a*a;

    if (x 为奇数)

     a*2;
    }

    把上面的2换成b就可以了。

    然后在做乘法的时候一边取模就可以了。

    【代码】

    #include <cstdio>
    
    int b,p,k,a = 1;
    
    void input_data()
    {
    	scanf("%d%d%d",&b,&p,&k);//b^p mod k
    }
    
    void ge_t(int x) 
    {
    	if (x == 0) //如果等于0就跳出 
    		return;
    	ge_t(x >> 1); //相当于x/2 
    	a = (a * a) % k; //相乘 注意取模 
    	if ( (x % 2)== 1) //如果x为奇数还要再乘一个底数 
    		a = ( a * (b %k)) %k;
    }
    
    void output_ans()
    {
    	printf("%d^%d mod %d=%d
    ",b,p,k,a); //最后输出a就可以了。 
    }	
    
    int main()
    {
    	input_data();
    	ge_t(p);
    	output_ans();
    	return 0;
    }	


  • 相关阅读:
    Execl获取真实行数
    日期工具类
    Eclipse & IDEA快捷键对比大全
    【转】IDEA导入Eclipse项目 详细步骤(亲自验证导入成功)
    京东的四大集团
    马云演讲视频
    阿里系的一些重要网站
    阿里系的几个电商网站
    腾讯几款QQ软件
    电脑版微信使用说明
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632399.html
Copyright © 2020-2023  润新知