你谷炸裂操作
  • 板块灌水区
  • 楼主Suffix_Sum
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/5/26 18:14
  • 上次更新2023/10/23 14:43:33
查看原帖
你谷炸裂操作
326797
Suffix_Sum楼主2023/5/26 18:14

本地跑数据2.276s,洛谷4s时限4.2s卡满!!!太nb了!!!!

https://www.luogu.com.cn/record/111277498

代码:

#include<bits/stdc++.h>
#include<unordered_map>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/hash_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
#define int long long
int n,N;
int qzh[10000005];
signed mob[10000005];
signed zs[10000005];
bool flag[10000005];
gp_hash_table<long long,long long>m;
int ny6,ny4;
signed dfs(int x)
{
	if(x<=10000000)
	{
		return qzh[x]; 
	}
	if(m.find(x)!=m.end())
	{
		return m[x];
	}
	int ans=1;
	for(int i=2,j;i<=x;i=j+1)
	{
		j=(x/(x/i));
		int modi=(i-1)%N,modj=j%N;
		//i^2+...+j^2;
		ans-=((modj*(modj+1)%N*(2*modj+1)%N-modi*(modi+1)%N*(2*modi+1)%N+N)*ny6%N)*dfs(x/i)%N;
		if(ans<0)
			ans+=N;
	}
	m[x]=ans;
	return ans;
 } 
int ksm(int x,int c)
{
	if(c==0)
	{
		return 1;
	}
	if(c%2==0)
	{
		int tmp=ksm(x,c/2);
		tmp*=tmp;
		tmp%=N;
		return tmp;
	}
	else
	{
		int tmp=ksm(x,c/2);
		tmp*=tmp;
		tmp%=N;
		tmp*=x;
		tmp%=N;
		return tmp; 
	}
}
int ans,cnt,modj1,tt,modi1;
signed main()
{
	cin>>N>>n;
	//N=1000000007;
	//n=9786510294;//测速 
	const int NN=N;
	const int nn=n;
	ny6=ksm(6,NN-2);
	ny4=ksm(4,NN-2);
	mob[1]=1;
	qzh[1]=1;
	for(int i=2;i<=10000000;i++)
	{
		if(flag[i]==0)
		{
			zs[++cnt]=i;
			mob[i]=-1;
		}
		qzh[i]=qzh[i-1]+i*i*mob[i];
		qzh[i]%=NN;
		if(qzh[i]<0)
		{
			qzh[i]+=NN;
		}
		for(int j=1;j<=cnt&&1LL*i*zs[j]<=10000000;j++)
		{
			flag[i*zs[j]]=1;
			if(i%zs[j]==0)
			{
				mob[i*zs[j]]=0;
				break;
			}
			mob[i*zs[j]]=-mob[i];
		}
	}
	for(int i1=1,j1;i1<=nn;i1=j1+1)
	{
		j1=nn/(nn/i1);
		int x1=nn/i1;
		cnt=0;
		for(int i2=1,j2;i2<=x1;i2=j2+1)
		{
			j2=x1/(x1/i2);
			//cout<<":"<<i2<<" "<<j2<<endl;
			cnt+=(dfs(j2)-dfs(i2-1)+NN)*(((x1/i2+1)*(x1/i2)/2%NN)*((x1/i2+1)*(x1/i2)/2%NN)%NN)%NN;
			cnt%=NN;
		}
		//cout<<"::"<<i1<<" "<<cnt<<" "<<tt<<endl;
		modj1=j1%NN,modi1=i1%NN;
		tt=(modj1*modj1%NN*(modj1+1)%NN*(modj1+1)%NN-(modi1-1)*(modi1-1)%NN*modi1%NN*modi1%NN+NN)*ny4%NN;
		ans+=tt*cnt%NN;
		ans%=NN;	
	}
	cout<<ans<<endl;
	return 0;
}
2023/5/26 18:14
加载中...