zoukankan      html  css  js  c++  java
  • 【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;
    }	


  • 相关阅读:
    正则匹配
    curator.zookeeper
    linux tail 命令查看日志 并加上颜色
    k8s一些命令
    k8s文件传递及scp
    Linux下如何在不解压jar包查看或修改配置文件
    MySQL教程之concat以及group_concat的用法
    JavaCV读取流设置超时
    学习html5 canvas 圆环
    jquery使用$.each()
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7632399.html
Copyright © 2011-2022 走看看