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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值