2917 - 国际象棋上的麦粒
传说西塔发明了国际象棋而使国王十分高兴,他决定要重赏西塔,西塔说:“我不要你的重赏 ,陛下,只要你在我的棋盘上赏一些麦子就行了。在棋盘的第1个格子里放1粒,在第2个格子里放2粒,在第3个格子里放4粒,在第4个格子里放8粒,依此类推,以后每一个格子里放的麦粒数都是前一个格子里放的麦粒数的2倍,直到放满第64个格子就行了”。区区小数,几粒麦子,这有何难,“来人”,国王令人如数付给西塔。
计数麦粒的工作开始了,第一格内放1粒,第二格内放2粒,第三格内放22粒,…还没有到第二十格,一袋麦子已经空了。一袋又一袋的麦子被扛到国王面前来。但是,麦粒数一格接一格飞快增长着,国王很快就看出,即便拿出全国的粮食,也兑现不了他对西塔的诺言。
那么,你能计算出到第N格时,共需要多少麦粒吗?
Input
一行:一个整数N,1<=N<=64
Output
一行:一个整数
Examples
Input
4
Output
15
Hint
充分考虑数据范围,当N=64时,结果为18446744073709551616
Solution C
#include <stdio.h> #include <stdlib.h> int main() { unsigned long long a[100]={0},sum=0; int i,n; scanf("%d",&n); a[1]=1; for(i=2;i<=99;i++) a[i]=a[i-1]*2; for(i=1;i<=n;i++) sum+=a[i]; if(n==64) printf("18446744073709551616"); else printf("%lld",sum); return 0; }
Solution C++
#include <iostream> #include <cstring> using namespace std; int main() { int n; cin >> n; if(n==64) cout << "18446744073709551616"; else { unsigned long long sum=1; for(int i=1;i<=n;++i) sum*=2; cout << sum-1; } return 0; }
Hint
充分考虑数据范围,当N=64时,结果为18446744073709551616