洛谷 P1762 偶數(楊輝三角性質)

P1762 偶數
題目描述

給定一個正整數n,請輸出楊輝三角形前n行的偶數個數對1000003取模後的結果。

輸入格式
一個數

輸出格式
結果

輸入輸出樣例
輸入 #1 複製

6

輸出 #1 複製

6

說明/提示
對於30%的數據,n<=4000

對於70%的數據,n<=4*10^9

對於100%的數據,n<=10^15

楊輝三角形的前七行:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

通過觀察,可以發現,奇數個數比偶數個數更有規律,其規律在於:

1.每行奇數個數一定爲2^k(k爲自然數)
2.當行數恰爲2k(k爲自然數)時,奇數個數爲2k,偶數個數爲零
3.當行數恰爲2k(k爲自然數)時,奇數個數和恰爲3(k-1)
4.更巧妙的是:這個規律能更加擴展到一個不爲2k的數上,因爲每一個數,都能分解爲若干項2k的和的形式。

舉個例子吧:當n=2333;

2333 = 2048+256+16+8+4+1

通過暴力程序,我們可以找出2333的所有奇數個數爲190985

那麼,我們找出如下數字
我們可以發現:

行數 所有奇數個數
2048 177147
256 6561
16 81
8 27
4 9
1 1

177147×1 + 6561×2 + 81×4 + 27×8 + 9×16 + 1×32 恰好等於 190985!
Code:

#include<iostream>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
using namespace std;
typedef unsigned long long ll;
#define mod 1000003
ll a[100],b[100];
int main()
{

    ll n,sum=0,num=0,l=1;
    scanf("%lld",&n);
    b[0]=1;
    for(int i=1; i<100; i++)
    {
        b[i]=b[i-1]*3%mod;
    }
    num=(n%mod)*(n%mod+1)/2%mod;
    int i=0;
    while(n)
    {
        if(n&1)
            a[i]=1;
        n>>=1;
        i++;
    }//二進制化
    for(int i = 61; i >= 0; i--)
    {
        if(a[i])
        {
            num = (num - b[i] * l % mod + mod) % mod;
            l = (l % mod * 2) % mod;
        }
    }
    if(num>=sum)
        printf("%lld\n",num-sum);
    else
        printf("%lld\n",mod+num-sum);
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章