优美等式

想不到吧,我被卡常了。

http://iai.sh.cn/problem/612

#pragma GCC optimize("Ofast","-funroll-loops")
#pragma GCC target("sse4.1","sse4.2","ssse3","sse3","sse2","sse","avx2","avx","popcnt","tune=native")
#include <bits/stdc++.h>
#define pb push_back
using namespace std;
#define N (int)(2e6+5)
#define M (int)(2e6)
#define ull unsigned long long
#define base 19260817
#define ll long long
bool vis[N];
ull val[N],B[N];
int pri[N],nw[N],cnt,las[N];
int n,m; 
ll ans;
unordered_map<ull,int>mp;

void init() {
	for(int i=1;i<=M;i++) nw[i]=i,las[i]=0;
	for(int i=2;i<=M;i++) {
		if(!vis[i]) {
			pri[++cnt]=i; val[i]=1; las[i]=cnt; nw[i]=1;
			for(int j=i+i;j<=M;j+=i) {
				vis[j]=1;
				int qwq=0;
				while(nw[j]%i==0) ++qwq,nw[j]/=i;
				val[j]=val[j]*B[cnt-las[j]];
				if(qwq&1) ++val[j];
				las[j]=cnt;
			}
		}
	}
	for(int i=1;i<=M;i++) val[i]=val[i]*B[cnt-las[i]];
}

signed main() {
//	freopen("xgf.out","w",stdout);
	cin.tie(0); ios::sync_with_stdio(false);
	B[0]=1; for(int i=1;i<=M;i++) B[i]=B[i-1]*base;
	init();
//	for(int i=1;i<=M;i++) {
//		int x=i,las=0; ull h=0;
////		cout<<x<<'\n';
//		for(int j:vec[i]) {
//			int qwq=0;
//			while(x%j==0) ++qwq,x/=j;
////			cout<<id[j]<<" "<<las<<'\n';
//			h=h*B[id[j]-las]; las=id[j];
//			if(qwq&1) ++h;
//		}

//		h=h*B[cnt-las];
//		val[i]=h;
//	}
	cin>>n>>m;
	if(n<m) swap(n,m);
	for(int i=1;i<=m;i++) ++mp[val[i]];
	for(int i=1;i<=n;i++) ans+=mp[val[i]];
	cout<<ans; 
	return 0;
}
posted @ 2022-03-17 14:06  FxorG  阅读(53)  评论(0编辑  收藏  举报