刚刚比赛T1 WA#2 求hack
  • 板块学术版
  • 楼主Gaoxing233
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/7/20 18:53
  • 上次更新2024/7/20 20:11:47
查看原帖
刚刚比赛T1 WA#2 求hack
1100612
Gaoxing233楼主2024/7/20 18:53

求hack,赛时代码码风不好请见谅

#include <bits/stdc++.h>
using namespace std;
using llt=long long;
const llt mod=20070720ll;
llt t,n,k,a[500001],ans=0ll,p[500001],q[500001];
int main()
{
	scanf("%lld",&t);
	while(t--)
	{
		ans=0ll;
		memset(p,0,sizeof(p));
		memset(q,0,sizeof(q));
		p[1]=1ll;
		scanf("%lld%lld",&n,&k);
		for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
		for(int i=2;i<=max(30ll,n);i++) p[i]=(p[i-1]*(k%mod))%mod;//每一位的十进制值 
		for(int i=1;i<=n;i++) q[i]=(q[i-1]+p[i])%mod;
		//计算每一位十进制值的前缀和,通过a[i]*q[n-i+1]*i可以算出以a[i]为最高位的k进制数的和 
		for(int i=1;i<=n;i++) ans=(ans+((((a[i]%mod)*q[n-i+1])%mod)*i)%mod)%mod;
		if(k>mod) printf("%lld\n",ans);
		else
		{
			int pos;
			for(int i=2,tmp=1;i<=max(30ll,n);i++)
			{
				if(ans<p[i]||p[i]<=tmp)
				{
					pos=i-1;
					break;
				}
				tmp=p[i];
			}
			for(int i=pos;i>=1;i--)
			{
				printf("%lld ",ans/p[i]);
				ans%=p[i];
			}
			printf("\n");
		}//输出答案 
	}
	return 0;
}
2024/7/20 18:53
加载中...