社区讨论

MnZn刚学OI一秒钟求助

P5071[Ynoi Easy Round 2015] 此时此刻的光辉参与者 5已保存回复 14

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
14 条
当前快照
1 份
快照标识符
@mhj11qnh
此快照首次捕获于
2025/11/03 18:58
4 个月前
此快照最后确认于
2025/11/03 20:32
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int __int128
#define ll long long
using namespace std;
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
	return x*f;
}
template <class T>
T randint(T l, T r = 0) 
{
    static mt19937 A(time(0));
    if(l>r)
        swap(l,r);
    uniform_int_distribution<T> B(l, r);
    return B(A);
}
int gcd(int x,int y)
{
	if(x<y)swap(x,y);
	while(y)
	{
		int t=x%y;
		x=y;
		y=t;
	}
	return x;
}
int qpow(int a,int n,int p)
{
	int ans=1;
	while(n)
	{
		if(n&1)ans=(ans*a)%p;
		a=a*a%p;
		n>>=1;
	}
	return ans;
}
bool Miller_Labin(int x)
{
	if(x<3)return x==2;
	if(x%2==0)return 0;
	int A[7]={2,325,9375,28178,450775,9780504,1795265022},d=x-1,r=0;
	while(d%2==0)d/=2,r++;
	for(int i=0;i<7;i++)
	{
		int a=A[i];
		int v=qpow(a,d,x);
		if(v<=1||v==x-1)continue;
		for(int j=1;j<=r;j++)
		{
			v=v*v%x;
			if(v==x-1&&j!=r)
			{
				v=1;
				break;
			}
			if(v==1)return 0;
		}
		if(v!=1)return 0;
	}
	return 1;
}
int Pollard_Rho(int N)
{
	if(N==4)return 2;
	if(Miller_Labin(N))return N;
	while(1)
	{
		int c=randint(1ll,(ll)(N-1));
        auto f=[=](ll x){return ((int)x*x+c)%N;};
		ll t=0,r=0,p=1,q;
		do
		{
			for(int i=0;i<128;i++)
            {
                t=f(t),r=f(f(r));
                if(t==r||(q=(int)p*abs(t-r)%N)==0)
                    break;
                p=q;
            }
            ll d=gcd(p,N);
            if(d>1)
                return d;
		}while(t!=r);
	}
}
const int mod=19260817;
vector<signed> vec;
set<int> factor;
vector<int> Factor;
vector<int> Vfactor[100005];
int a[100005];
struct node{
	signed id,l,r,Iwb;
	ll ans;
}Q[100005];
bool cmp(node x,node y)
{
	return x.Iwb<y.Iwb||(x.Iwb==y.Iwb&&(((x.Iwb%2==1)&&x.r<y.r)||((x.Iwb%2==0)&&x.r>y.r)));
}
bool cmp2(node x,node y)
{
	return x.id<y.id;
}
signed h[200005];
map<ll,signed> H;
ll inv[200005];
signed d[100005][169];
ll l=1,r=0,ans=1;
void add(signed x)
{
	for(signed i=0;i<Vfactor[x].size();i++)
	{
		if(h[Vfactor[x][i]]!=0)ans=(ans*inv[h[Vfactor[x][i]]])%mod;
		h[Vfactor[x][i]]++;
		if(h[Vfactor[x][i]]!=0)ans=ans*h[Vfactor[x][i]]%mod;
	}
}
void del(signed x)
{
	for(signed i=0;i<Vfactor[x].size();i++)
	{
		if(h[Vfactor[x][i]]!=0)ans=(ans*inv[h[Vfactor[x][i]]])%mod;
		h[Vfactor[x][i]]--;
		if(h[Vfactor[x][i]]!=0)ans=ans*h[Vfactor[x][i]]%mod;
	}
}
signed main()
{
//	freopen("sb.in","r",stdin);
	signed n=read(),m=read();
	signed block=sqrt(n);
	for(signed i=1;i<=1000;i++)
		if(Miller_Labin(i))
			vec.push_back(i);
	for(signed i=1;i<=n;i++)
	{
		a[i]=read();
		for(signed j=0;j<vec.size();j++)
		{
			while(a[i]%vec[j]==0)
			{
				a[i]/=vec[j];
				d[i][j+1]++;
			}
			d[i][j+1]+=d[i-1][j+1];
		}
		if(a[i]!=1)
		{
			int t=Pollard_Rho(a[i]);
			if(t==a[i])
			{
				factor.insert(a[i]);
				Vfactor[i].push_back(a[i]);
			}
			else
			{
				factor.insert(t);
				factor.insert(a[i]/t);
				Vfactor[i].push_back(t);
				Vfactor[i].push_back(a[i]/t);
			}
		}
	}
	for(signed i=1;i<=2*n;i++)inv[i]=qpow(i,mod-2,mod);
	for(signed i=1;i<=2*n;i++)h[i]=1;
	int cntccc=0;
	for(auto it=factor.begin();it!=factor.end();it++)
		H[*it]=++cntccc;
	for(signed i=1;i<=n;i++)
		for(signed j=0;j<Vfactor[i].size();j++)
			Vfactor[i][j]=H[Vfactor[i][j]];
	for(signed i=1;i<=m;i++)
	{
		signed l=read(),r=read();
		Q[i].id=i;
		Q[i].l=l;Q[i].r=r;
		Q[i].Iwb=(l-1)/block+1;
	}
	sort(Q+1,Q+m+1,cmp);
	for(signed i=1;i<=m;i++)
	{
		ll t=1;
		for(signed j=1;j<=168;j++)
			t=t*(d[Q[i].r][j]-d[Q[i].l-1][j]+1)%mod;
		while(r<Q[i].r)add(++r);
		while(l>Q[i].l)add(--l);
		while(l<Q[i].l)del(l++);
		while(r>Q[i].r)del(r--);
		Q[i].ans=ans*t%mod;
	}
	sort(Q+1,Q+m+1,cmp2);
	for(signed i=1;i<=m;i++)printf("%lld\n",Q[i].ans);
    return 0;
}
114行没开long long时WA+TLE72pts,但是开了long long就A 了,求大佬解释为什么不会TLE了

回复

14 条回复,欢迎继续交流。

正在加载回复...