zoukankan      html  css  js  c++  java
  • HDU4059 The Boss on Mars 容斥定理

    将与N不互质的数全部找出来,再应用容斥定理求得最后的结果。这题在求 a/b MOD c 的时候使用费马小定理等价于 a*b^c(-2) MOD c.用x/lnx 可以估计出大概有多少素数。

    代码如下:

    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #define MOD 1000000007LL
    using namespace std;
    
    typedef long long int Int64;
    typedef long long int LL;
    
    Int64 rec[55000000], res;
    
    int idx;
    
    Int64 N, sum;
    
    Int64 _pow(Int64 a, Int64 b)
    {
        a %= MOD;
        Int64 ret = 1;
        while (b) {
            if (b & 1) {
                ret *= a;
                ret %= MOD;
            }
            a *= a;
            a %= MOD;
            b >>= 1;
        }
        return ret;
    }
    
    void PowMode(  )
    {
        res = 1;
        LL a = 30LL;
        LL b = MOD  - 2;
        while( b )
        {
             if( b&1 ) res = (res*a)%MOD;
             a = ( a * a )%MOD;
             b >>= 1;
        }
    }
    
    Int64 Get_sum( Int64 N )
    {
       Int64 ans = N;
       ans = ( ans * ( N + 1 ) )%MOD;
       ans = ( ans * ( 2 *N + 1 ) )%MOD;
       ans = ( ans * ( ( 3 * N * N )%MOD + (3*N)%MOD - 1 + MOD)%MOD )%MOD;
       return (ans * res)%MOD;
    }
    
    void cut(Int64 x)
    {
        idx = 0;
        int LIM = (int)sqrt(double(x));
        if (!(x & 1)) {
            rec[++idx] = 2;
            while (!(x & 1)) {
                x /= 2;
            }
        }
        for (int i = 3; i <= LIM; i += 2) {
            if (x % i == 0) {
                rec[++idx] = i;
                while (x % i == 0) {
                    x /= i;
                }
            }
        }
        if (x != 1) {
            rec[++idx] = x;
        }
    }
    
    void dfs(int p, Int64 num, int sign)
    {
        if (p == idx) {
            if (num > 1) {
                sum += sign * (_pow(num, 4) * Get_sum(N/num)) % MOD;
                sum = ((sum % MOD) + MOD) % MOD;
            }
            return;
        }
        dfs(p+1, num, sign);
        dfs(p+1, num*rec[p+1], -sign);
    }
    
    int main()
    {
        int T;
        PowMode();
        scanf("%d", &T);
        while (T--) {
            sum = 0;
            scanf("%I64d", &N);
            cut(N);
            dfs(0, 1, -1);
            printf("%I64d\n", (((Get_sum(N)-sum) % MOD) + MOD) % MOD);
        }
        return 0;
    }
  • 相关阅读:
    行政区划遮罩 -Leaflet
    WebGIS vs WebGL图形编程
    oracle 中 group by 加强
    Nagios监控服务搭建
    MySQL触发器使用详解
    mybatis--一对多关联
    mybatis--一对一关联查询
    mybatis--实现数据库增删改查
    mybatis--使用接口注解的方式实现Helloword
    mybatis--第一个mybatis程序
  • 原文地址:https://www.cnblogs.com/Lyush/p/2613700.html
Copyright © 2011-2022 走看看