CF1225D 求卡常
  • 板块学术版
  • 楼主lgx57
  • 当前回复0
  • 已保存回复1
  • 发布时间2024/9/8 16:32
  • 上次更新2024/9/8 19:51:40
查看原帖
CF1225D 求卡常
1053695
lgx57楼主2024/9/8 16:32

rt,TLE on test 6

#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int mod=31451413;
const int N=1e7+5;
int a[N];
int qp(int x,int k){
	int ans=1,base=x;
	while (k){
		if (k&1) ans*=base;
		if (ans>1e10||base>=3e9) return 0;
		base*=base;
		k>>=1;
	}
	return ans;
}
int buc[N];
int n,k;
vector<int> v;
bool f[N];
int pr[N],cnt;
void sh(int n){
	for (int i=1;i<=n;i++){
		f[i]=1;
	}
	f[1]=0;
	for (int i=2;i<=n;i++){
		if (f[i]){
			pr[++cnt]=i;
		}
		for (int j=1;j<=cnt&&i*pr[j]<=n;j++){
			f[i*pr[j]]=0;
			if (!i%pr[j]){
				break;
			}
		}
	}
}
int mp[mod+5];
int ans;
signed main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>k;
	for (int i=1;i<=n;i++){
		cin>>a[i];
		buc[a[i]]++;
	}
	int ma=max(a[1],a[2]),sma=min(a[1],a[2]);
	for (int i=3;i<=n;i++){
		if (a[i]>=ma){
			sma=ma;
			ma=a[i];
		}
		else if (a[i]>sma) sma=a[i];
	}
	for (int i=1;;i++){
		if (k*log(i)<=log(sma*ma)) v.push_back(qp(i,k));
		else break;
	}
	if (k==2){
		sh(1e5);
		for (int i=1;i<=n;i++){
			int now=0,base=1;
			int x=a[i];
			for (int j=1;j<=cnt;j++){
				int c=0;
				while (x%pr[j]==0) c^=1,x/=pr[j];
				if (!c) c=mod-1;
				now=(now+base*c)%mod;
				base=(base*2)%mod;
			}
			mp[now]++;
		}
		for (int i=1;i<=n;i++){
			int now=0,base=1;
			int x=a[i];
			for (int j=1;j<=cnt;j++){
				int c=0;
				while (x%pr[j]==0) c^=1,x/=pr[j];
				if (!c) c=mod-1;
				now=(now+base*c)%mod;
				base=(base*2)%mod;
			}
			ans+=mp[now]+mp[mod-now-1];
		}
		goto code;
	}
	for (int c:v){
		for (int i=1;i<=n;i++){
			if (c%a[i]) continue;
			int x=c/a[i];
			ans+=buc[x];
		}
	}
	code:
	for (int i=1;i<=1e5;i++){
		if (!buc[i]) continue;
		for (int x:v){
			if (i*i==x){
				ans-=buc[i];
				break;
			}
		}
	}
	cout<<ans/2;
	return 0;
}
2024/9/8 16:32
加载中...