题目描述
给定一个正整数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
解释:找规律呀,发现2n层的奇的个数是3n,同样不是整2幂次的,可以拆成2幂相加,得到最后答案后直接总数减奇数就好了
#include<iostream>
#define ll long long
using namespace std;
bool pos[2100]={0};
ll mod=1000003LL;
ll cal(ll a,ll b){
ll sum=1%mod;
while(b){
if(b&1) sum=a*sum%mod;
a=a*a%mod;b>>=1;
}
return sum;
}
ll n=0;
int t=0;
int num=0;
ll ret=0;
int main(){
cin>>n;
ret=n%mod*((n+1)%mod)%mod%mod*cal(2,mod-2)%mod;
while(n){
num+=n&1;
pos[t++]=n&1;n>>=1;
}
for(int i=0;i<t;i++){
if(pos[i]){
ret-=cal(3LL,i)*cal(2LL,num-1)%mod;
ret%=mod;ret+=mod;ret%=mod;
num--;
}
}
cout<<ret<<endl;
return 0;
}