1 条题解

  • 0
    @ 2025-8-24 22:39:10

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 良心WA题人
    啦叭叭叭 啾啾啾啦叭叭叭

    搬运于2025-08-24 22:39:10,当前版本为作者最后更新于2022-07-10 20:01:52,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    fnf_n 表示答案,则显然 fn=Σdnϕnd×df_n=\Sigma_{d|n}\phi_\frac{n}{d}\times d

    gx=xg_x=x,显然 gxg_x 为积性函数。那么右半边就是 fxf_xgxg_x 的迪利克雷卷积。又因为 ϕx\phi_x 为积性函数,而根据积性函数的性质不难知道 fxf_x 是积性函数。所以,fxf_x 的值仅与 fpkf_{p^k} 有关。并且,不难推出来 fpk=pk+pk×(11p)×kf_{p^k}=p^k+p^k\times(1-\dfrac{1}{p})\times k。所以,我们只需要知道如何才能得到 nn 的因数 pkp^k

    我们可以询问 gcd(p,n)gcd(p^\infty ,n)。然后得到的值 aa 就是 nn 的因数 pkp^k。因为返回的值对PP取模,所以,我们就得到了一个同余方程:pka(modP)p^k \equiv a \pmod P

    那么,我们就可以用 BSGSBSGS 求出第一个解。然后通解就知道了。将通解存到一个数组里,那么我们可以二分这个数组,找到数组中的 kk,使返回值 gcd(pk,a)=agcd(p^k,a)=agcd(pk1,a)agcd(p^{k-1},a)\not=a,那么这个 pkp^k 就是 nn 的因子,计算答案即可。。。。?

    注意到,这样做只能得到前三个 subtask 的分。输出一下每个解是膜多少的剩余类,发现所有的都大于 1000010000 。所以在次数为 001000010000 的范围内只会有一个解。那么,直接用得到的解就行了。

    std:

    #include<bits/stdc++.h>
    using namespace std;
    const int NN=1004,P=998244353;
    int prime[NN],vis[NN*100];
    int qmi(int a,int b)
    {
    	int res=1;
    	while(b)
    	{
    		if(b&1)
    			res=1ll*res*a%P;
    		a=1ll*a*a%P;
    		b>>=1;
    	}
    	return res;
    }
    int bsgs(int a,int b)
    {
    	if(1%P==b%P)
    		return 0;
    	unordered_map<int,int>hash;
    	int k=sqrt(P)+1;
    	for(int i=0,j=b%P;i<k;i++)
    	{
    		hash[j]=i;
    		j=1ll*j*a%P;
    	}
    	int ak=1;
    	for(int i=1;i<=k;i++)
    		ak=1ll*ak*a%P;
    	for(int i=1,j=ak;i<=k;i++)
    	{
    		if(hash.count(j))
    			return i*k-hash[j];
    		j=1ll*j*ak%P;
    	}
    	return -1;
    }
    int main()
    {
    	vis[1]=true;
    	int cnt=0;
    	for(int i=2;cnt<=1000;i++)
    		if(!vis[i])
    		{
    			prime[++cnt]=i;
    			for(int j=i*i;j<=1e5;j+=i)
    				vis[j]=true;
    		}
    	int ans=1;
    	for(int i=1;i<=cnt;i++)
    	{
    		printf("GetGCD. 1 %d 1000000\n",prime[i]);
    		fflush(stdout);
    		int k;
    		scanf("%d",&k);
    		int t=bsgs(prime[i],k);
    		ans=1ll*ans*((k+1ll*k*(prime[i]-1)%P*qmi(prime[i],P-2)%P*t%P)%P)%P;
    	}
    	printf("IFoundTheAnswer! %d",ans);
    	return 0;
    }
    
    • 1

    信息

    ID
    7760
    时间
    5000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    0
    已通过
    0
    上传者