Lucky Pascal Triangle --- Gym - 102091F(找规律 + 递归)
Posted stay-online
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于Lucky Pascal Triangle --- Gym - 102091F(找规律 + 递归)的主要内容,如果未能解决你的问题,请参考以下文章
F.Lucky Pascal Triangl(lucas+数位dp)