zoukankan      html  css  js  c++  java
  • [hdu6051]If the starlight never fade-[欧拉函数+原根]

    Description

    传送门

    Solution

    orz大佬yxq。。本题神仙

    设g为P的原根。

    设$x=g^{a}$,$y=g^{b}$。

    由于$(g^{a}+g^{b})^{i}equiv (g^{a})^{i}(mod P)$

    可得$(1+g^{b-a})^{i}geqslant 2(mod P)$。

    设$g^{k}=1+g^{b-a}$($1leq k<P-1$)(注意这里的后一个符号是<)!,故$kiequiv 0(mod P-1)$。

    可得k最小为$frac{P-1}{gcd(P-1,i)}$,又因为k<P-1所以k的取值范围为:$k=cntfrac{P-1}{gcd(P-1,i)}$。

    其中cnt属于集合[1,gcd(P-1,i)-1]。(当cnt=gcd(P-1,i)时k恰好为P-1,且当cnt变小k一定变小,故cnt的上界为gcd(P-1,i)-1)

    此处由于y是有限制(<=m)的不便处理,我们考虑当y固定时x的个数(x可以是1到p-1任意值)。

    由于$g^{k}=g^{b-a}$,即$g^{k}-1=g^{b-a}$,则$x(g^{k}-1) equiv y(modP)$。

    因为$1leq k<P-1$,所以针对不同的$g^{k}-1$会有不同的x。

    根据以上推断可以分析出$f(i)=m(gcd(P-1,i)-1)$。

    $ans=sum _{i=1}^{P-1}f(i)=msum _{i=1}^{P-1}i(gcd(P-1,i)-1)$

    $=-P(P-1)+msum _{i=1}^{P-1}i(P-1,i)$
    $=-P(P-1)+msum _{d|(P-1) }dsum _{ d|i,1leq ileq P-1}i[gcd(P-1,i)==d]$

    $=-P(P-1)+msum _{d|(P-1) }d^{2}sum_{i=1}^{frac{P-1}{d}}i[gcd(frac{P-1}{d},i)==1]$

    $=-P(P-1)+msum _{d|(P-1)}d^{2}frac{frac{P-1}{d}varphi(frac{P-1}{d})+[frac{P-1}{d}==1]}{2}$ *

    *嗯我们或许还要证明一个东西。。

    $sum _{i=1}^{n}i[gcd(n,i)==1]=frac{nvarphi(n)+[n==1]}{2}$

    关于这个式子,关键点是如果gcd(n,i)=1,则gcd(n,n-i)=1。

    证明。。显然吧。如果gcd(n,i)=1,$i[gcd(n,i)==1]+(n-i)[gcd(n,n-i)==1]=2n$,优秀的结论。然后这里当n=1要特判(因为此时n-i=1-1=0就不合法啦)。

    接下来就可以愉快地搞事~

     Code

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    typedef long long ll;
    const int mod=1e9+7;
    int m,p;
    ll ans;
    int getphi(int n)
    {
        int re=n;
        for (int i=2;(ll)i*i<=n;i++)
        {
            if (n%i==0)
            {
                while (n%i==0) n/=i;
                re-=re/i;
            }
        }
        if (n!=1) re-=re/n;
        return re;
    }
    ll _work(int d,int o)
    {
        return 1ll*d*d%mod*(1ll*o*getphi(o)+(o==1))/2%mod;
    }
    ll solve(int x)
    {
        ll re=0;
        for (int i=1;(i*i)<=x;i++)
        if (x%i==0)
        {
            re=(re+_work(x/i,i))%mod;
            if (i!=x/i) re=(re+_work(i,x/i))%mod;
        }
        re-=((ll)x*(x+1)/2)%mod;
        if (re<0) re+=mod;
        return re;
    }
    int T;
    int main()
    {
        scanf("%d",&T);
        for (int tt=1;tt<=T;tt++){
        scanf("%d%d",&m,&p);
        ans=solve(p-1);
        printf("Case #%d: %lld
    ",tt,ans*m%mod);
        }
    }
  • 相关阅读:
    hibernate反向工程 (eclipse和myeclipse)【转】
    让你明白response.sendRedirect()与request.getRequestDispatcher().forward()区别
    Struts Tags
    在Eclipse中配置tomcat
    The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path:
    如何将maven项目导入myeclipse中
    Hibernate配置文件详解
    网站怎么布局能解决不同浏览器对CSS解析的差异,使用css reset
    SqlServer:此数据库处于单用户模式,导致数据库无法删除的处理
    Myeclipse最全快捷键
  • 原文地址:https://www.cnblogs.com/coco-night/p/9545164.html
Copyright © 2011-2022 走看看