求教卡常(
  • 板块P9148 除法题
  • 楼主waauto可爱小猫
  • 当前回复12
  • 已保存回复12
  • 发布时间2023/3/12 18:36
  • 上次更新2023/10/23 21:44:35
查看原帖
求教卡常(
355192
waauto可爱小猫楼主2023/3/12 18:36

测了极限数据循环次数是 2×1092\times 10^9 理论来说能过

#include <bits/stdc++.h>
using namespace std;
const int N=5e3+5;
#define int unsigned int 
int n;
int a[N];
int qwq[N][N],ovo[N][N];
bool cmp(int a,int b){return a>b;}
int ans=0;
int lpos[N];
int g1,g2;
//long cnt=0;
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++){
		lpos[a[i]]=max(lpos[a[i]],i);
	}
	lpos[5001]=1;
	lpos[0]=n;
	for(int i=5000;i>=1;i--)if(!lpos[i])lpos[i]=lpos[i+1];
	//	cout<<"lxl"<<endl;
	for(int i=1;i<=5000;i++) for(int j=1;j<=5000;j++)ovo[i][j]=i/j+1;
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			qwq[i][j]=a[i]/a[j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			int now=j+1,nowi=qwq[i][j+1],nowj=qwq[j][j+1];
//			int cnt=0;
			while(now<=n){
//				cnt++;
				g1=ovo[a[i]][nowi+1],g2=ovo[a[j]][nowj+1];
				g1=lpos[max(g1,g2)];
				ans+=qwq[i][j]*qwq[i][now]*qwq[j][now]*(g1+1-now);
				now=g1+1;
				nowi=qwq[i][now];
				nowj=qwq[j][now];
			}
//			cout<<cnt<<endl;
		}
	}
//	cout<<cnt;
	cout<<ans;
	return 0;
}

用的分块,还是说2×1092\times10^9不能过()

2023/3/12 18:36
加载中...