Lucky Pascal Triangle --- Gym - 102091F(找规律 + 递归)

题目

  https://vjudge.net/problem/Gym-102091F

题意

  给出 T 组数据,每组数据给出一个 n,找杨辉三角前 n 层有多少个数是 7 的倍数。

题解

  先打表成杨辉三角状找规律,然后会发现是一个以 7 为单位的变化方式,那么递归 *7,同时维护其中有多少个不是 7 的倍数的数,那么最后也就是找不是整块出现的三角形里面有多少个小三角,这个可以在回溯时进行处理。

  tip:注意预先处理 2 的逆元。

 1 #include <bits/stdc++.h>
 2 #define ll long long
 3 #define ull unsigned long long
 4 #define met(a, b) memset(a, b, sizeof(a))
 5 #define rep(i, a, b) for(int i = a; i <= b; i++)
 6 #define bep(i, a, b) for(int i = a; i >= b; i--)
 7 #define lowbit(x) (x&(-x))
 8 #define MID ((l + r) / 2)
 9 #define ls (pos<<1)
10 #define rs ((pos<<1)+1)
11 #define pb push_back
12 #define ios() ios::sync_with_stdio(0)
13 
14 using namespace std;
15 
16 const int maxn = 1e5 + 1010;
17 const int inf = 0x3f3f3f3f;
18 const ll INF = 0x3f3f3f3f3f3f3f3f;
19 const ll mod = 1e9 + 7;
20 const double eps = 1e-4;
21 
22 ll inv2, res;
23 
24 ll qmul(ll x, ll n) {
25     ll sum = 1;
26     while(n) {
27         if(n & 1) (sum *= x) %= mod;
28         (x *= x) %= mod;
29         n >>= 1;
30     }
31     return sum;
32 }
33 void f(ll &l, ll &r, ll now, ll &num) {
34     if(l*7 < r) {
35         l *= 7;
36         f(l, r, now*(1 + 7) %mod *7 %mod *inv2 %mod, num);
37     }
38     if(r == 0) return;
39     ll t = r / l;
40     (res -= num*now %mod *(1 + t) %mod *t %mod *inv2 %mod) %= mod;
41     num = num*(t + 1) % mod;
42     r %= l;
43     l /= 7;
44 }
45 
46 int main() {
47     inv2 = qmul(2, mod - 2);
48     ios();
49     int T, k = 0;
50     cin >> T;
51     while(T--) {
52         ll n;
53         cin >> n;
54         n++;
55         res = ((1 + n) % mod) *(n % mod) % mod *inv2 % mod;
56         ll l = 1, r = n, num = 1;
57         f(l, r, 1ll, num);
58         res = (res % mod + mod) % mod;
59         cout << "Case " << ++ k << ": ";
60         cout << res << endl;
61     }
62     return 0;
63 }

猜你喜欢

转载自www.cnblogs.com/Stay-Online/p/12191347.html