标签:while 描述 输入输出 含义 c++ == 应该 class base
给定一个正整数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。
输入文件只有1行,为2个正整数,用一个空格隔开:
k N (k、N的含义与上述的问题描述一致,且3≤k≤15,10≤N≤1000)。
输出格式:输出文件为计算结果,是一个正整数(在所有的测试数据中,结果均不超过2.1*109)。(整数前不要有空格和其他符号)。
3 100
981
NOIP 2006 普及组 第四题
不难发现,相加有一定的规律。
k^0 , k^1, k^1 + k^0, k^2, k^2 + k^0, k^2 + k^1, k^2 + k^ 1 + k^0, k^3..
1 10 11 100 101 110 111 1000
只需证k^1 + k^2 + ... + k^n < k^(n + 1),上述结论即可成立
只需证 (1 - k^n)/(1 - k) < k^n
只需证 k^n - 1 < k^(n + 1) - k^n
只需证2k^n < k^(n + 1) + 1
只需证k^n < k^(n + 1)/2 + 1/2 ①
由于k >= 3 k^n < k^n * k/2 ①式显然成立
证毕
1 #include <bits/stdc++.h> 2 int k,n; 3 long long ans; 4 long long pow(int a,int b) 5 { 6 if(b == 0)return 1; 7 long long r = 1,base = a; 8 while(b) 9 { 10 if(b & 1)r *= base; 11 base *= base; 12 b >>= 1; 13 } 14 return r; 15 } 16 int main() 17 { 18 scanf("%d %d", &k, &n); 19 for(int i = 1;n;i ++) 20 { 21 if(n & 1 == 1)ans += pow(k, i - 1); 22 n >>= 1; 23 } 24 printf("%lld", ans); 25 return 0; 26 }
标签:while 描述 输入输出 含义 c++ == 应该 class base
原文地址:http://www.cnblogs.com/huibixiaoxing/p/6980157.html