【hdu6051】If the starlight never fade
Solution
神仙题qwq好吧我个人感觉是神仙题
这题其实有一个比较野路子的做法。。就是。。打表观察。。反正场上ckw大佬就是这样把这题A穿的%%%
然而实际上正解很神秘或者说很妙。。虽然说是不是用原根是。。套路?反正记录一下:
注意到P是奇质数,那么我们可以找到一个模P意义下的原根g
然后因为原根具有一些十分优秀的性质(存在唯一的a满足ga=x,其中x∈[1,p),a∈[1,p))所以我们可以开始快乐了
我们记x=ga,y=gb(a,b∈[1,p)),那么原来求f(i)的式子可以变成:
(就是两边同除以xi)
然后因为1+gb−a>=2,所以一定存在唯一一个k∈[1,p−1)满足:
所以我们可以把上面的式子写成:
也就是说(P−1)|ki(因为原根的性质并且gP−1≡1(mod P)),那么考虑k的取值,我们可以把k写成这样:
然后因为k∈[1,P−1),所以s′∈[1,gcd(P−1,i)),所以k总共有gcd(P−1,i)−1种取值
这个时候反过来想,这gcd(P−1,i)−1种取值,对应的是那么多个不同的k,再反推回去对应的就是那么多个b−a的取值,也就是说当b固定的时候,也就是y固定的时候,有那么多个a可以取(也就是说有那么多个x可以取),即对于每一个y,能取的x都有gcd(P−1,i)−1个
那所以f(i)=m(gcd(P−1,i)−1)
(可以这样一路推上去都是因为原根那个一一对应的性质,否则不能进行这么神秘的操作)
那所以我们的问题变成了求:
这个时候我们就要开始大力化式子了qwq:
这个时候我们需要一个黑科技:
具体为什么的话就是。。如果说我们知道gcd(n,i)=1,我们可以推出gcd(n,n−i)=1,因为如果gcd(n,n−i)=x(x>1),那么i=n−(n−i)应该也是x的倍数,所以gcd(n,i)≠1(最少为x),所以矛盾,得证
然后我们把每一对i和n−i凑在一起就是上面那个式子的样子了
然后对于n=1的情况需要特判一下就是如果n=1那么应该是等于1,也就是n⋅φ(n)+[n=1]2
然后有了这个黑科技我们就可以得到最终的式子:
然后φ的话直接根号求,然后枚举一下因数就好了
代码大概长这个样子
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MOD=1e9+7,inv2=500000004;
int n,m,P,ans,T;
int mul(int x,int y){return 1LL*x*y%MOD;}
int add(int x,int y){return (1LL*x+y)%MOD;}
int Phi(int x){
int ret=1;
for (int i=2;i*i<=x;++i){
if (x%i==0) ret=mul(ret,(i-1)),x/=i;
while (x%i==0) ret=mul(ret,i),x/=i;
}
if (x>1) ret=mul(ret,(x-1));
return ret;
}
int calc(int n){
int ret=0,x,tmp;
for (int i=1;i*i<=n;++i){
if (n%i) continue;
x=n/i;
tmp=add(mul(Phi(x),x),(x==1));
tmp=mul(1LL*i*i%MOD,tmp);
ret=add(ret,tmp);
if (i*i==n) continue;
x=i;
tmp=add(mul(Phi(x),x),(x==1));
tmp=mul(1LL*(n/i)*(n/i)%MOD,tmp);
ret=add(ret,tmp);
}
ret=mul(ret,inv2);
ret=add(ret,MOD-(1LL*(n+1)*n/2)%MOD);
return ret;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int tmp,x;
scanf("%d",&T);
for (int o=1;o<=T;++o){
scanf("%d%d",&m,&P);
ans=calc(P-1);
printf("Case #%d: %d\n",o,mul(m,ans));
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步