当前位置: 首页 > 工具软件 > StarLight > 使用案例 >

hdu 6051 If the starlight never fade

金高轩
2023-12-01

复健复健。。。
标题和题目似乎没什么关系。。。

显然 (x+y)iximodp ( x + y ) i ≡ x i mod p 左右两边都不能为0。
p p 的原根为d x+ydbmodp,xdamodp x + y ≡ d b mod p , x ≡ d a mod p
有:
dbidaimodp d b i ≡ d a i mod p
i(ba)0modϕ(p) i ( b − a ) ≡ 0 mod ϕ ( p )
显然, ba=ϕ(p)(ϕ(p),i)k|k[1,(ϕ(p),i)1] b − a = ϕ ( p ) ( ϕ ( p ) , i ) k | k ∈ [ 1 , ( ϕ ( p ) , i ) − 1 ]
那么,设 ba b − a 任意一个解为 z z
da+yda+zmodp
x+yxdzmodp x + y ≡ x d z mod p
yx1dz1modp y x − 1 ≡ d z − 1 mod p
xy(dz1)1modp x ≡ y ( d z − 1 ) − 1 mod p
因为 z z 必然模ϕ(p)不为0,所以每一个 y y 都存在(ϕ(p),i)1个对应的 x x
即:f(i)=m((ϕ(p),i)1)

结果为:
m(ϕ(p)i=1i(ϕ(p),i)ϕ(p)i=1i) m ( ∑ i = 1 ϕ ( p ) i ( ϕ ( p ) , i ) − ∑ i = 1 ϕ ( p ) i )
枚举gcd,有:
p1i=1i(p1,i)=k|p1k2ϕ(p1k)p1k+[k=p1]2 ∑ i = 1 p − 1 i ( p − 1 , i ) = ∑ k | p − 1 k 2 ϕ ( p − 1 k ) p − 1 k + [ k = p − 1 ] 2
直接计算即可,复杂度为 O(plogp) O ( p l o g p )

#include<algorithm>
#include<string.h>
#include<stdio.h>
#include<cmath>
using namespace std;
#define clr(a) memset(a,0,sizeof(a))
//--Container
//
typedef long long ll;
const ll md=1e9+7;
inline ll qni(ll a,ll b){ll r=1;for(;b;b>>=1,a=a*a%md)if(b&1)r=r*a%md;return r;};
const ll _2=qni(2,md-2);

ll rs;int p[30][2],pd;
void _qs(int n){
    int i,j,d=sqrt(n);for(i=2,pd=0;i<=d&&n>1;++i)if(!(n%i)){
        for(p[pd][1]=0,p[pd][0]=i;!(n%i);n/=i)p[pd][1]++;++pd;
    }
    if(n>1){p[pd][0]=n,p[pd][1]=1;++pd;}
};

void _dfs(int ts,int k,int n,int d){
    if(d==pd)
        rs=(rs+(ll)(n/k)*(n/k)%md*((ll)ts*k%md+(k==1?1:0))%md*_2%md);
    else{
        _dfs(ts,k,n,d+1);int i;for(i=1,k*=p[d][0],ts*=(p[d][0]-1);i<=p[d][1];++i){
            _dfs(ts,k,n,d+1);
            ts*=p[d][0],k*=p[d][0];
        }
    }
};
int ct=0;
void _cl(int n,int m){
    int i,j;_qs(n-1);rs=0;_dfs(1,1,n-1,0);rs=(rs+md-((ll)n*(n-1)%md*_2%md))%md;rs=rs*m%md;
    printf("Case #%d: %I64d\n",++ct,rs);
};
void cl(){
    int n,m;scanf("%d %d",&m,&n);_cl(n,m);
};

int main(){
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
#endif
    int t;scanf("%d",&t);while(t--)cl();
    return 0;
};
 类似资料:

相关阅读

相关文章

相关问答