切面条
Description
有一个做面条的师傅,空闲的时候他喜欢切面条玩,他切面条的方法是:把面条对折几次,然后一刀从左半部分中间处切开,第二刀从右半部分中间处切开。师傅想要知道最后会变成几根面条,你能帮助他吗?
注意:面条足够长。
Input
输入一个非负整数n(0<=<10^18)表示对折面条的次数。
Output
输出对折n次后切了两刀之后面条的根数,结果对1000000007取余。
Sample Input
0
2
Sample Output
3
9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include<cstdio>
const
int
maxn=1000000007;
long
long
pow
(
long
long
x,
long
long
m){
if
(m==1)
return
x;
if
(m%2==0)
return
pow
((x*x)%maxn,m/2);
else
return
(
pow
((x*x)%maxn,m/2)*x)%maxn;
}
int
main(){
long
long
n;
while
(
scanf
(
"%lld"
,&n)==1){
long
long
temp=(
pow
(2,n+1)+1)%maxn;
printf
(
"%lld\n"
,temp);
}
return
0;
}
|
对于大数据处理本题用到的知识点是:要计算只包含加法、减法和乘法的整数表达式除以整数n的余数,可以在每步计算之后对n取余,结果不变。