codevs 1141 数列(二进制&快速幂)
来源:互联网 发布:陈大可的知乎icm 编辑:程序博客网 时间:2024/05/28 06:05
题目描述 Description
给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:
1,3,4,9,10,12,13,…
(该序列实际上就是:3^0,3^1,3^0+3^1,3^2,3^0+3^2,3^1+3^2,3^0+3^1+3^2,…)
请你求出这个序列的第N项的值(用10进制数表示)。
例如,对于k=3,N=100,正确答案应该是981。
输入描述 Input Description
只有1行,为2个正整数,用一个空格隔开:
k N(k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)
输出描述 Output Description
为计算结果,是一个正整数(可能较大你懂的)。(整数前不要有空格和其他符号)
样例输入 Sample Input
3 100
样例输出 Sample Output
981
思路:由于第N个数字是互不相等的k的方幂之和,所以每个方幂在这个数字里面最多出现一次,每个方幂是否出现可以用一个bit位来表示,幂次代表bit位的位置,于是k^3表示成1000,k^0表示成0001,k^0+k^1表示成0011所有的这类数字按从大到小的顺序排出来就是0001,0010,0011,0100……第N项其实就是N转换成二进制之后,再将相应的位转换成相应的k的方幂!
代码如下
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm>#define LL long long int using namespace std; LL pow(LL x,LL n) // 快速幂{ LL res=1; while(n>0) { if(n & 1) res=(res*x); x=x*x; n >>= 1; } return res; } int main(){ int k,n; scanf("%d%d",&k,&n); LL sum=0; int num=0; while(n) { if(n%2) { sum+=pow(k,num); } n/=2; num++; } printf("%lld",sum); return 0;}
阅读全文
0 0
- codevs 1141 数列(二进制&快速幂)
- codevs 3332 数列(矩阵快速幂)
- codevs 1141 数列 二进制 解题报告
- 【codevs 1250】Fibonacci数列(矩阵快速幂)
- codevs 1250 Fibonacci数列(矩阵快速幂)
- 矩阵快速幂 -codevs斐波拉契数列2
- 矩阵快速幂 CodeVS 1250 Fibonacci数列
- <矩阵快速幂>codevs 3332 数列
- codevs 1281 Xn数列 快速幂+快速加防溢出
- noip2006 数列 (二进制)
- codevs 1250(矩阵快速幂)
- 【codevs 3500】快速幂
- Fibonacci数列(矩阵乘法快速幂)
- Fibonacci数列(矩阵乘法快速幂)
- 数列(矩阵乘法+快速幂)
- 数列 快速幂
- Fibonacci 数列快速幂
- CODEVS 3332 数列
- PHP 操作文件没有权限:Permission denied
- java反射
- java script
- [Assembly] 程序的机器级表示(二):数据传输指令
- L1-025. 正整数A+B
- codevs 1141 数列(二进制&快速幂)
- Spring TestContext测试框架搭建
- 37 C语言加减乘除运算
- Android7.0完美适配——FileProvider拍照裁剪全解析
- Spring Bean java显式配置类注入Bean
- 使用JSON技术结合MVC模式C标签实现登录功能
- TCP UDP之网络编程及数据库入门
- 部落图鉴之Go:爹好还这么努力?
- 程序员面试心得及如何看待培训班