求助2D
  • 板块学术版
  • 楼主Unnamed114514
  • 当前回复5
  • 已保存回复5
  • 发布时间2023/10/8 23:58
  • 上次更新2023/11/2 14:51:02
查看原帖
求助2D
556362
Unnamed114514楼主2023/10/8 23:58

RT,死活拍不出来

#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f3f3f3f3fll
#define double long double
#define eps 1e-10
#define endl '\n'
using namespace std;
const int N=1e5+5,mod=998244353;
int n,lsh[N],p[N],a[N],b[N],cnt[N],ans,val[N],tot[N],mx[N];
struct BIT{
	int c[N];
	inline int lowbit(int x){ return x&-x; }
	inline void add(int x,int y){ for(;x<=n;x+=lowbit(x)) c[x]+=y; }
	inline int ask(int x){
		int s=0;
		for(;x;x-=lowbit(x)) s+=c[x];
		return s;
	}
}T;
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>n;
	p[0]=1;
	for(int i=1;i<=n;++i) p[i]=p[i-1]*2%mod;
	for(int i=1;i<=n;++i) cin>>a[i];
	for(int i=1;i<=n;++i){
		for(int j=i;j<=n;j+=i){
			if(a[j]>mx[i]) tot[i]=0,mx[i]=a[j];
			if(a[j]==mx[i]) ++tot[i];
		}
		lsh[i]=mx[i];
	}
	for(int i=1;i<=n;++i) for(int j=1;j<=sqrt(i);++j) if(i%j==0){
		if(mx[j]==a[i]&&tot[j]==1&&j!=i) ++val[i];
		if(i/j!=j&&i/j!=i&&mx[i/j]==a[i]&&tot[i/j]==1) ++val[i];
	}
	sort(lsh+1,lsh+n+1);
	for(int i=1;i<=n;++i) b[i]=lower_bound(lsh+1,lsh+n+1,mx[i])-lsh,T.add(b[i],1);
	for(int i=1;i<=n;++i){
		if(mx[i]==a[i]) ans=(ans+p[cnt[b[i]]+T.ask(b[i]-1)]*a[i]%mod)%mod;
		ans=(ans+(p[val[i]]+mod-1)%mod*p[T.ask(b[i]-1)]%mod*a[i]%mod)%mod;
		++cnt[b[i]];
	}
	cout<<ans<<endl;
	return 0;
}
2023/10/8 23:58
加载中...