zoukankan      html  css  js  c++  java
  • hdu 4059 数论+高次方求和+容斥原理

    http://acm.hdu.edu.cn/showproblem.php?

    pid=4059

    现场赛中通过率挺高的一道题 可是容斥原理不怎么会。。

    參考了http://blog.csdn.net/acm_cxlove/article/details/7434864

    1、求逆元   p=1e9+7是素数。所以由 a^(p-1)%p同余于1 可得a%p的逆元为a^(p-2)

    2、segma(i^k)都能够通过推导得到求和公式 详见http://blog.csdn.net/acm_cxlove/article/details/7434864

    3、容斥原理。还在恶补中  代码写的挺美丽

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #include <set>
    #include <cmath>
    #include <vector>
    using namespace std;
    #define ll long long
    #define IN(s) freopen(s,"r",stdin)
    #define OUT(s) freopen(s,"w",stdout)
    
    const int MOD  =  1000000007;
    const int N = 10005;
    const int M = 10050;
    ll n,thr;//thr 30的逆元
    vector<int>fac;
    
    bool is[N]; int prm[M];
    int getprm(int n){
        int i, j, k = 0;
        int s, e = (int)(sqrt(0.0 + n) + 1);
        memset(is, 1, sizeof(is));
        prm[k++] = 2; is[0] = is[1] = 0;
        for(i = 4; i < n; i += 2) is[i] = 0;
        for(i = 3; i < e; i += 2) if(is[i]) {
                prm[k++] = i;
                for(s = i * 2, j = i * i; j < n; j += s)
                    is[j] = 0;
    // 由于j是奇数,所以+奇数i后是偶数,不必处理!
            }
        for( ; i < n; i += 2) if(is[i]) prm[k++] = i;
        return k;  // 返回素数的个数
    }
    
    ll qmod(ll x,ll t)
    {
        ll ret=1,base=x;
        while(t)
        {
            if(t&1)ret=(ret*base)%MOD;
            base=(base*base)%MOD;
            t/=2;
        }
        return ret;
    }
    
    ll sum(ll x)
    {
        ll ret=1;
        ret=(ret*x)%MOD;
        ret=(ret*(x+1))%MOD;
        ret=(ret*((2*x+1)%MOD))%MOD;
        ret=(((3*x*x)%MOD+(3*x)%MOD-1+MOD)%MOD*ret)%MOD;
        return (ret*thr)%MOD;
    }
    
    inline ll four(ll x)
    {
        return (((x%MOD)*x%MOD)*x%MOD)*x%MOD;
    }
    
    ll dfs(int cur, ll tmp)//容斥原理
    {
        ll ret=0,f;
        for(int i=cur;i<fac.size();i++)
        {
            f=fac[i];
            ret=(ret+(sum(tmp/f)*four(f))%MOD)%MOD;
            ret=( (ret-dfs(i+1,tmp/f)*four(f))%MOD+MOD )%MOD;
        }
        return ret%MOD;
    }
    
    int main()
    {
        //IN("hdu4059.txt");
        int ncase;
        ll s1,s2;
        scanf("%d",&ncase);
        int prmnum=getprm(N-1);
        thr=qmod(30,MOD-2);
        while(ncase--)
        {
            scanf("%I64d",&n);
            //int sn=(int)sqrt(n);
            fac.clear();
            ll tmp=n;
            for(int i=0;i<prmnum && prm[i]<=tmp;i++)
            {
                if(tmp%prm[i] == 0)
                {
                    fac.push_back(prm[i]);
                    while(tmp%prm[i] == 0)
                        tmp/=prm[i];
                }
            }
                //while(tmp%prm[i] == 0)fac.push_back(prm[i]),tmp/=prm[i];
            if(tmp!=1)fac.push_back(tmp);
            //cout << "FUck= " << sum(n) << endl;
            printf("%I64d
    ",( (sum(n)- dfs(0,n)+MOD)%MOD + MOD)%MOD );
        }
        return 0;
    }
    


  • 相关阅读:
    IOS 沙盒机制 浅析
    IOS CALayer(二)
    IOS CALayer(一)
    IOS 二维码扫描
    IOS 二维码生成
    UIView属性
    JSON 与 XML 的比较
    Xcode 中 pch 文件配置
    Error:linker command failed with exit code 1 (use -v to see invocation)
    开发常用宏
  • 原文地址:https://www.cnblogs.com/slgkaifa/p/6807977.html
Copyright © 2011-2022 走看看