题目描述
给定一个正整数n,请输出杨辉三角形前n行的偶数个数对1000003取模后的结果。
输入输出格式
输入格式:一个数
输出格式:结果
输入输出样例
说明
对于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
分析:
本题数据范围太大了。。。所以不可能用普通做法,接下来,我决定。。。看题解。。。
根据kkk大佬题解
“打出杨辉三角形前若干行的奇偶分布情况,便会发现这是一个分形图形。这样就可以用递归解决问题。具体实现时可以直接计算,也可以先算总个数再减去奇数的数量(比较好算)。用扩展欧几里德或欧拉定理来解决除法取模问题,或是直接用高精计算,最后取模。”
于是,代码就出来了。
CODE(根据某大佬代码):
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 long long k,t,n,ans,nx,mi3[1001],d,mod=1000003,a[1001],p; 5 int main() 6 {long long i; 7 //freopen("11.in","r",stdin); 8 scanf("%lld",&n); 9 nx=n; 10 k=0; 11 d=1; 12 for (i=1;i<=51;i++) 13 d*=2; 14 t=51; 15 while (n) 16 { 17 if (n>=d) 18 { 19 n=n-d; 20 a[++k]=t; 21 } 22 d/=2; 23 t--; 24 } 25 n=nx; 26 mi3[0]=1; 27 for (i=1;i<=a[1];++i) 28 { 29 mi3[i]=(mi3[i-1]*3)%mod; 30 } 31 32 for (i=1;i<=k;++i) 33 ans=(ans+mi3[a[i]]*(long long)(1<<(i-1)))%mod; 34 //cout<<ans<<endl; 35 ans%=mod; 36 p=(((n%mod)*(n%mod+1)))/2; 37 p%=mod; 38 if (p<ans)p+=mod; 39 p=(p-ans)%mod; 40 printf("%lld ",p); 41 }