题意:

给你一个很大的n, 要你求n的拆分有几种方式, 答案模1000000007.

把n进行拆分, 可以看出n个1进行隔板, 答案就是 2 ^(n - 1)

由于n的数字较大, 用费马小定理进行降幂

a^n % p== a^(n - (p-1) - ....- (p-1)) % p = a^(n%(p-1))%p

 

/*
Algorithm:整数和拆分 + 快速幂 + 费马小定理降幂 
Author: anthony1314
Creat Time:
Time Complexity:
*/

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<cstring>
#include<cstdio>
#include<bits/stdc++.h>
#define ll long long
#define maxn 100005
#define modd 1000000007
#define line printf("--------------");
using namespace std;
char str[maxn];

/*
a^(p-1) % p == 1
a^n % p == a^((n-1)%(p-1)) % p 
*/
ll ksm(ll a, ll b){
	ll ans = 1;
	while(b){
		if(b & 1){
			ans = ans * a % modd;
		}
		b = b / 2;
		a = a * a % modd;
	}
	return ans;
}
int main() {
	while(gets(str)){
		ll m = modd - 1;
		ll ans = 0;
		int len = strlen(str);
		for(int i = 0; i < len; i++){// 将输入的数字 模以 mod-1 费马小降幂 
			ans = ans * 10 + str[i] - '0';
			ans = ans % m;
		}
		ans = (ans - 1 + m) % m;
		ll t = ksm(2, ans);
		cout<<t<<endl;
	}
	return 0;
}