HDU 5363 Key Set

Problem Description

soda has a set S with n integers {1,2,…,n}. A set is called key set if the sum of integers in the set is an even number. He wants to know how many nonempty subsets of S are key set.

Input

There are multiple test cases. The first line of input contains an integer T (1≤T≤105), indicating the number of test cases. For each test case:

The first line contains an integer n (1≤n≤109), the number of integers in the set.

Output

For each test case, output the number of key sets modulo 1000000007.

Sample Input

4
1
2
3
4

Sample Output

0
1
3
7

普通函数

可以用普通快速幂函数来写,

#include<iostream>

using namespace std;
#define mod 1000000007
typedef long long ll;

ll ppow(ll x, ll n)
{
	ll result = 1;
	for (;n; n >>= 1)
	{
		if (n & 1)
		{
			result *= x;
			result %= mod;
		}
		x *= x;
		x %= mod;
	}
	return result;
}

int main()
{
	int t;
	ll n, x;
	scanf_s("%d", &t);
	while (t--)
	{
		scanf_s("%lld", &n);
		printf("%lld\n", ppow(2, n - 1) - 1);
	}
	return 0;
}

递归公式

#include<iostream>

using namespace std;
#define mod 1000000007
typedef long long ll;

ll powmod(ll x, ll n)
{
	if (!n)
		return 1;
	if (n & 1)
		return x * powmod(x * x % mod, n >> 1) % mod;
	return powmod(x * x % mod, n >> 1) % mod;
}


int main()
{
	int t;
	ll n, x;
	scanf_s("%d", &t);
	while (t--)
	{
		scanf_s("%lld", &n);
		printf("%lld\n", powmod(2, n - 1) - 1);
	}
	return 0;
}

快速幂公式

(1).x是奇数
xn =(x2%mod)n/2%mod;
(2)x是偶数
xn =((x2%mod)n/2*x)%mod;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值