• hdu4059The Boss on Mars 容斥原理


    //求1到n之间与n互质的数的四次方的和
    //segma(n^4) = (6n^5+15n^4+10n^3-n)/30
    //对于(a/b)%mod能够转化为(a*inv(b))%mod
    //inv(b)为b的逆元
    //由费马小定理a^(p-1) = 1(modp) a , p 互质可得
    //30的逆元为30^(mod-2)
    //由容斥原理非常easy得到与n不互质的数之和为
    //对于全部的n的素数因子
    //一个素数因子的全部数的四次方之和-有两个素数因子的全部数的四次方之和+有三个。

    。。。
    //然后用总的减去不互质的即为互质的
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    using namespace std ;
    const int maxn = 1010 ;
    typedef __int64 ll ;
    const __int64 mod = 1e9+7 ;
    int p[maxn] ;
    int len ;
    ll  inv ;
    void get_prime(ll n)
    {
        len = 0 ;
        for(int i = 2;i*i <= n;i++)
        {
            if(n%i == 0)p[++len] = i;
            while(n%i==0)n/=i ;
        }
        if(n>1)p[++len] = n ;
    }
    ll Pow(ll a , ll b)
    {
        ll c = 1 ;
        while(b)
        {
            if(b&1)c = (c*a)%mod;
            a = (a*a)%mod;
            b >>= 1;
        }
        return c ;
    }
    ll dfs(int pos , int n)
    {
        ll ans = 0 ;
        for(int i = pos;i <= len ;i++)
        {
            ll t = n/p[i] ;
            ll t_1 = ((((6*Pow(t,5) + 15*Pow(t,4) + 10*Pow(t,3) - t))%mod)*inv)%mod;
            ans = (ans + (Pow(p[i] , 4)*(t_1- dfs(i+1 , n/p[i]))))%mod;
        }
        return ans ;
    }
    int main()
    {
        int T ;
        scanf("%d" , &T) ;
        inv = Pow(30 , mod - 2) ;
        while(T--)
        {
            ll n ;
            scanf("%I64d" , &n) ;
            get_prime(n) ;
            ll ans = (((((6*Pow(n,5) + 15*Pow(n,4) + 10*Pow(n,3) - n))%mod)*inv)%mod - dfs(1 , n))%mod ;
            printf("%I64d " , (ans+mod)%mod);
        }
        return  0 ;
    }







  • 相关阅读:
    Redis12:客户端
    Redis11:事件
    Redis10:RDB持久化与AOF持久化
    Redis09:过期时间与删除策略、redis中的特殊线程
    Redis08:redis中的对象与存储形式
    Redis07:底层:基数树radix tree
    Redis06:底层:跳跃链表skiplist
    C++基础知识:异常处理
    C++基础知识:STL简介
    C++基础知识:泛型编程
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7339187.html
Copyright © 2020-2023  润新知