• 洛谷P1762 杨辉三角,规律


    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;
    }
  • 相关阅读:
    学习进度笔记16
    《软件架构师的12项修炼》阅读笔记1
    学习进度笔记15
    CSS前端性能优化
    多行文本溢出,显示省略号
    VIM编辑器使用
    iOS 兼容性处理
    javascript 对象
    JS滚轮事件(mousewheel/DOMMouseScroll)了解
    MarkDown编辑器基础使用教程
  • 原文地址:https://www.cnblogs.com/Hugh-Locke/p/10270561.html
Copyright © 2020-2023  润新知