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;
}