社区讨论

70分WA求助

P1762偶数参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lod0r57e
此快照首次捕获于
2023/10/30 22:52
2 年前
此快照最后确认于
2023/11/05 09:10
2 年前
查看原帖
CPP
#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
思路是找最大的分形三角形然后再处理下面等差数列的偶数+两个小三角形

回复

0 条回复,欢迎继续交流。

正在加载回复...