题目链接: http://codeforces.com/problemset/problem/185/A
题目描述: 给你一个三角形,每次在上三角形中画一个下三角形, 在下三角形中画一个上三角形, 求最终的上三角形总数是多少
解题思路: 用矩阵快速幂很好求, 矩阵也很好构造, 这里就不写了, 由于每一层中的上三角形都比上一层多一个, 所以我们只要求出来最下一层再用等差公式就可以了, 第一个最下一层的三角形是1, 然后是2, 4, 8......所以答案就是(1+2^n)*2^n/2
代码:
#include <iostream> #include <cstdio> #include <string> #include <vector> #include <cstring> #include <iterator> #include <cmath> #include <algorithm> #include <stack> #include <deque> #include <map> #define lson l, m, rt<<1 #define rson m+1, r, rt<<1|1 #define mem0(a) memset(a,0,sizeof(a)) #define meminf(a) memset(a,-0x3f,sizeof(a)) #define fi(n) for(i=0;i<n;i++) #define fj(m) for(j=0;j<m;j++) #define sca(x) scanf("%d",&x) #define ssca(x) scanf("%s",x) #define scalld(x) scanf("%I64d",&x) #define print(x) printf("%d ", x) #define printlld(x) printf("%I64d ",x) #define de printf("======= ") #define yes printf("YES ") #define no printf("NO ") typedef long long ll; using namespace std; const int mod = 1e9+7; ll q_power( ll num, ll n ) { ll ret = 1; while( n ) { if( n & 1 ) ret = ret * num % mod; n >>= 1; num = num * num % mod; //num *= num % mod; // 两者有什么区别? } return ret; } int main() { ll n; while( cin >> n ) { if( n == 0 ) { cout << "1" << endl; continue; } ll temp = q_power(2, n); cout << (1+temp)*temp/2%mod << endl; } return 0; }
思考: 遇到一个小坑坑, num *= num % mod 与 num = num * num % mod 是不一样的, WA了两次, 真的蠢, 以后注意, 最近思想上有点儿波动, 自我调整一下