https://www.luogu.org/problemnew/show/P1762
题意:给定一个正整数n,请输出杨辉三角形前n行的偶数个数对1000003取模后的结果。
由于N <= 1e15,这就暗示我们这是一道需要打表找规律的图。
年轻的花花以为求偶数个数就应当打偶数个数的表,不料这题的规律在于奇数。
所以一张完整的表应当把偶数个数,偶数个数和,奇数个数,奇数个数和,总数全部表示出来。
当行数为2 ^ k时,该行的奇数为2 ^ k个,即全部为奇数,该行的奇数和为3 ^ k 个。
所以当行数为2 ^ k的形式的时候,可以很容易的通过求和公式算出总个数再减去奇数的方式来计算答案。
现在问题要扩展到行数不满足条件的时候
规律就是将行数分为 p = 2 ^ k1 + 2 ^ k2 ....... + 2 ^kn的形式(kn > kn - 1 > .... > k2 > k1)
易得这样的形式唯一,第p行的奇数和就是 1 * (3 ^ kn) + 2 * (3 ^ kn - 1 ) + ... + pow(2,n - 1) * (3 ^ k1)次。
#include <map> #include <set> #include <ctime> #include <cmath> #include <queue> #include <stack> #include <vector> #include <string> #include <cstdio> #include <cstdlib> #include <cstring> #include <sstream> #include <iostream> #include <algorithm> #include <functional> using namespace std; inline int read(){int now=0;register char c=getchar();for(;!isdigit(c);c=getchar()); for(;isdigit(c);now=now*10+c-'0',c=getchar());return now;} #define For(i, x, y) for(int i=x;i<=y;i++) #define _For(i, x, y) for(int i=x;i>=y;i--) #define Mem(f, x) memset(f,x,sizeof(f)) #define Sca(x) scanf("%d", &x) #define Sca2(x,y) scanf("%d%d",&x,&y) #define Sca3(x,y,z) scanf("%d%d%d",&x,&y,&z) #define Scl(x) scanf("%lld",&x); #define Pri(x) printf("%d ", x) #define Prl(x) printf("%lld ",x); #define CLR(u) for(int i=0;i<=N;i++)u[i].clear(); #define LL long long #define ULL unsigned long long #define mp make_pair #define PII pair<int,int> #define PIL pair<int,long long> #define PLL pair<long long,long long> #define pb push_back #define fi first #define se second typedef vector<int> VI; const double eps = 1e-9; const int maxn = 110; const int INF = 0x3f3f3f3f; const int mod = 1000003; LL N; int cnt; LL quick_power(LL a,LL b){ LL ans = 1; while(b){ if(b & 1) ans = (ans * a) % mod; b >>= 1; a = (a * a) % mod; } return ans; } LL solve(int x){ LL sum = quick_power(3,x) * quick_power(2,cnt++) % mod; //cout << x << " " << sum << endl; return sum; } int main(){ Scl(N); LL ans = 0; cnt = 0; for(int i = 60; i >= 0; i --){ if(N & (1LL << i)) ans = (ans + solve(i)) % mod; } LL sum = (((N + 1) % mod) * (N % mod)) / 2 % mod; sum = ((sum - ans) % mod + mod) % mod; Prl(sum); return 0; }