偶数

题目描述

给定一个正整数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

 

分析:

本题数据范围太大了。。。所以不可能用普通做法,接下来,我决定。。。看题解。。。

根据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\n",p);
41 }

 

 

 

posted @ 2019-07-10 12:10  Sword_Art_Online  阅读(162)  评论(0编辑  收藏  举报