题目大意

求杨辉三角形前 $n$ 行的偶数个数,对 $1000003$ 取模。

分析

对杨辉三角奇数打表。

1
1 1
1   1
1 1 1 1
1	   1
1 1	 1 1
1   1   1   1
1 1 1 1 1 1 1 1
1			   1
1 1			 1 1
1   1		   1   1
1 1 1 1		 1 1 1 1
1	   1	   1	   1
1 1	 1 1	 1 1	 1 1
1   1   1   1   1   1   1   1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1							   1
1 1							 1 1
1   1						   1   1
1 1 1 1						 1 1 1 1
1	   1					   1	   1
1 1	 1 1					 1 1	 1 1
1   1   1   1				   1   1   1   1
1 1 1 1 1 1 1 1				 1 1 1 1 1 1 1 1
1			   1			   1			   1
1 1			 1 1			 1 1			 1 1
1   1		   1   1		   1   1		   1   1
1 1 1 1		 1 1 1 1		 1 1 1 1		 1 1 1 1
1	   1	   1	   1	   1	   1	   1	   1
1 1	 1 1	 1 1	 1 1	 1 1	 1 1	 1 1	 1 1
1   1   1   1   1   1   1   1   1   1   1   1   1   1   1   1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

于是递推公式

$$ f(2^t+n) = f(2^t) + 2f(n) $$

就是显然的了,那么偶数即是全部的减去奇数个数。

const ll MOD = 1000003;
ll nn[10086];

#define ACM_MOD MOD

#include "template/basic/qpow.hpp"
#include "template/basic/inv.hpp"

int main() {
	ll n = rr();
	nn[1] = 1;
	for (ll i = 2; i <= 100; i++)
		nn[i] = nn[i - 1] * 3 % MOD;
	ll t = 1, ans = 0;
	for (ll i = 1; i <= 100; i++) {
		if ((t & n) > 0)
			ans = (ans * 2 + nn[i]) % MOD;
		t = t << 1;
		if (t > n)
			break;
	}
	n = n % MOD;
	ll sum = n * (n + 1) % MOD * inv(2) % MOD;
	printf("%lld\n", (sum - ans + MOD) % MOD);
	return 0;
}