D. 田田的账号 2014新生暑假个人排位赛03
时间限制 1000 ms
内存限制 65536 KB
题目描述
田田申请了一个新的oj账号,打算取一个霸气而简单的名字。 什么叫简单呢?说白了田田脑子不好使,只能记住abcd这4个字母组成单词。 怎么叫霸气呢?田田认为a个个数一定要有奇数个,b的个数一定要有偶数个(包括0)才可以。 现在田田取了一个长为n的账号,但是由于田田的记性实在太差了,而把账号忘记了. 于是把这个问题交给了聪明的wzt,而他认为这道题太过于简单就把这道题交给了你 究竟这个账号有多少种可能?你只需得到这个结果模 109+7 的值
输入格式
多组case,第一行为case数 T ,之后 T 行每行一个整数 n 。 1≤n≤109 , T≤100
输出格式
一个case对应一行输出
输入样例
2
1
2
输出样例
1
4
赛中提交:NULL
赛后AC:YES
题目大意:
用abcd这4个字母组成单词
a个个数一定要有奇数个,b的个数一定要有偶数个(包括0)
给出单词长度n,求其符合条件的排列组合数
反省:
以后一见到这种明显也许会有规律类型的题目一定要先打表看看规律...
解法:
暴力打表(或者甚至笔算),之后就可以发现答案就是4的n-1次方...
因此用上一个快速幂算法就可以解决了
下面是ac代码
#include "iostream"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "string"
#include "vector"
#include "list"
#include "map"
#include "queue"
#include "stack"
#include "bitset"
#include "algorithm"
#include "numeric"
#include "functional"
#define mod (1000000000+7)
using namespace std;
typedef long long ll;
ll qpow(ll x,ll n)
{
if(n==0) return 1;
ll res=qpow(x*x%mod,n/2);
if(n&1) res=res*x%mod;
return res;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
ll n,x=4;
scanf("%lld",&n);
printf("%lld\n",qpow(x,n-1));
}
}