快速幂——while理解&&[P1965] 转圈游戏
2024-09-06 17:59:15
快速幂——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;
}
最新文章
- Jsp的九个内置对象
- Add project to working sets
- JavaScript根据CSS的Media Queries来判断浏览设备的方法
- openstack kilo 流量
- c++笔试题两道,求解当中一道
- jvisualvm 使用
- 【JMeter】JMeter在linux下运行
- javascript二维数组
- JZ2440开发笔记(2)——minicom的安装和配置使用【转】
- linux源码“.config”文件分析
- shiro不重启动态加载权限
- Animation-list,帧动画+属性动画,做出Flash般的效果
- 利用Python中的mock库对Python代码进行模拟测试
- Python Numpy shape 基础用法(转自他人的博客,如涉及到侵权,请联系我)
- L - The Shortest Path Gym - 101498L (dfs式spfa判断负环)
- easyui tree 默认选中第一个元素
- python零散补充与总结
- CSS3性能体验
- 【Vue】浅谈Vue不同场景下组件间的数据交流
- Easy-UI开发总结