70分WA求助
  • 板块P1762 偶数
  • 楼主dshzsh
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/11/2 21:51
  • 上次更新2023/11/5 09:10:10
查看原帖
70分WA求助
200116
dshzsh楼主2020/11/2 21:51
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1000003;
int p[61];
int ksm(int x,int n)
{
	if(n==1) return x%mod;
	if(n&1) return x*ksm(x*x%mod,n/2)%mod;
	return ksm(x*x%mod,n/2)%mod;
}
int solve(int n)
{
	//printf("<%lld>\n",n);
	if(n<=2) return 0;
	int ans=0;
	int i=0;
	while((1LL<<(i+1))<=n) i++;
	int d=1LL<<i;
	ans=ans+p[i];
	int k=n-d;
	if(k==0) return ans;
	ans=(ans+solve(k)*2)%mod+ksm(2,mod-2)*(d-1+d-1-k+1)%mod*k%mod+mod;
	return ans%mod;
}
signed main()
{
	p[2]=1;
	int c=2;
	for(int i=3;i<=60;i++)
	{ 
		c=c*2;
		c=c%mod;
		p[i]=p[i-1]*3+(c-1)*c%mod*ksm(2,mod-2)%mod;
		p[i]=p[i]%mod;
	}
	int n;
	scanf("%lld",&n);
	int ans;
	ans=solve(n);
	ans=ans%mod;
	printf("%lld",ans);
	return 0;
} 

rt
思路是找最大的分形三角形然后再处理下面等差数列的偶数+两个小三角形

2020/11/2 21:51
加载中...