zoukankan      html  css  js  c++  java
  • 快速幂——while理解&&[P1965] 转圈游戏

    快速幂——while理解

    [a^k ]

    把k转成2进制

    [k=2^n*p[n]+2^(n-1)*p[n-1]+...+2^1*p[1]+2^0*p[0] ]

    [a^k=a^(2^n*p[n]+2^(n-1)*p[n-1]+...+2^1*p[1]+2^0+p[0]) ]

    [a^k=a^(2^0*p[0])*a^(2^1*p[1])*a^(2^2*p[2])*...*a^(2^n*p[n]) ]

    [a^k=a^2^0^p[0]*a^2^1^p[1]*a^2^2^p[2]*...*a^2^n^p[n] ]

    p[0...n]不是一就是零
    一开始a=a,若p[0]=1,ans就乘a
    接着循环,a=a2,若p[1]=1,ans就乘a2
    以此类推
    直到第n项

    	int a;
    	int ans = 1;
    	while(k)
    	{
    		if(k % 2 == 1)	ans *=a;
    		k /= 2;
    		a *= a;
    	}
    

    转圈游戏

    裸快速幂

    #include <cmath>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    
    
    using namespace std;
    
    int a, n, m, x, k;
    long long mi;
    
    int QR()
    {
    	char c;
    	int sign = 1;
    	c = getchar();
    	while (c < '0' ||c > '9'){
    		if(c == '-')
    			sign = -1;
    		c = getchar();
    	}
    	int res = 0;
    	while(c <= '9' &&c >= '0'){
    		res *= 10;
    		res += c - '0';
    		c = getchar(); 
    	}
    	res *= sign;
    	return res;
    }
    
    int main()
    {
    	n=QR();
    	m=QR();
    	k=QR();
    	x=QR();
    	a = 10;
    	mi = 1;
    	while(k)
    	{
    		if(k % 2 == 1)	mi *=a;
    		k /= 2;
    		a *= a;
    		a %= n;
    		mi %= n; //必须随时取模,不然超ll 
    	}
    	mi *= m;
    	mi += x;
    	mi %= n;
    	printf("%lld",mi);
    	return 0;
    }
    
    
  • 相关阅读:
    %2d
    将块中的文字设置成属性,即实现块中文字可拖动的功能
    获得块参照的插入点方法
    排序
    将几个实体对象变成一个块
    对克隆实体的类型转换
    对实体的克隆
    递归-顺序输出任意正整数各位
    递归-汉诺塔
    递归-最大公约数
  • 原文地址:https://www.cnblogs.com/ZhengkunJia/p/12242890.html
Copyright © 2011-2022 走看看