P10035
写篇题解纪念一下在赛场上盲猜结论拿下的黄题。
思路
首先我们可以发现,把 01 串
而
这个 01 串对答案的最小贡献为
所以答案为
使用快速幂,复杂度
#include <bits/stdc++.h>
using namespace std;
const long long p = 1000000007;
long long t, n;
long long pmod(long long a, long long b) { // 快速幂
long long base = a, ans = 1;
while(b > 0) {
if(b & 1) ans = (ans * base % p) % p;
base = (base % p * base % p) % p;
b >>= 1;
}
return ans % p;
}
int main() {
cin >> t;
while(t--) {
cin >> n;
cout << ((pmod(3, n) - 1) % p * 500000004) % p << '\n';
// 注意这里要用乘法逆元,我是先前已经求了
}
return 0; // 完结撒花(?
}
题外话(赛时的做法)
先是求了一下
upd:https://www.luogu.com.cn/discuss/758589