hdu 4059 The Boss on Mars(纳入和排除)

http://acm.hdu.edu.cn/showproblem.php?pid=4059

定义S = 1^4 + 2^4 + 3^4+.....+n^4。如今减去与n互质的数的4次方。问共降低了多少。

容斥原理。能够先把与n不互质的数的4次方求出来。那就先对n进行质因子分解,对质因子的组合运用容斥原理。质因子个数为奇数就加,偶数就减。事实上与求[1,n]内与n互质的数的个数类似,该题重点是计算,防止乘法溢出。

对于求解1^4 + 2^4 + 3^4+.....+n^4,能够先类比1^2+2^2+...+n^2的求法,那么求4次方,

首先(n+1)^5= n^5 + 5*n^4 + 10*n^3 + 10*n^2 + 5*n^1 + 1.

那么2^5 = (1+1)^5 = 1^5 + 5*1^4 + 10*1^3 + 10*1^2 + 5*1^1 + 1.

3^5 = (2+1)^5 = 2^5 + 5*2^4 + 10*2^3 + 10*2^2 + 5*2^1 + 1.

........

........

(n+1)^5 = n^5 + 5*n^4 + 10*n^3 + 10*n^2 + 5*n^1 + 1.

将上述全部等式相加。两边抵消同样项,得到(n+1)^5 = 5*(1^4+2^4+……n^4)+10*(1^3+2^3+……+n^3)+10*(1^2+2^2+……+n^2)+5*(1+2+……+n)+n+1,

将1^3+2^3+……+n^3 = (n+1)^2*n^2/4和1^2+2^2+……+n^2
= (n*(n+1)*(2*n+1))/6带入上式,化简得到:

1^4+2^4+……n^4
= (n*(n+1)*(2n+1)*(3*n*n+3*n-1))/30。

由于要取余,要求30对1000000007的逆元,用扩展欧几里得就可以。

#include <stdio.h>
#include <iostream>
#include <map>
#include <set>
#include <bitset>
#include <list>
#include <stack>
#include <vector>
#include <math.h>
#include <string.h>
#include <queue>
#include <string>
#include <stdlib.h>
#include <algorithm>
#define LL __int64
//#define LL long long
#define eps 1e-9
#define PI acos(-1.0)
using namespace std;
const int maxn = 10010;
const LL mod = 1000000007;
LL n;
int fac[maxn];
int facCnt;
int prime[maxn];
LL ni,nii;

//求30对mod的逆元。
LL extend_gcd(LL a, LL b, LL &x, LL &y)
{
    if(b == 0)
    {
        x = 1;
        y = 0;
        return a;
    }
    LL d = extend_gcd(b,a%b,x,y);
    LL t = x;
    x = y;
    y = t-a/b*y;
    return d;
}

LL pow_4(LL t)
{
    LL anw =( ((t*(t+1))%mod*(2*t+1)%mod) * (((3*t*t)%mod+(3*t)%mod-1+mod)%mod )%mod*ni)%mod;
    return anw;
}

LL cal(LL m)
{
    LL t = n/m;
    LL anw1 = m;
    anw1 = (anw1*m)%mod;
    anw1 = (anw1*m)%mod;
    anw1 = (anw1*m)%mod;
    LL anw2 = pow_4(t);
    LL anw = (anw1*anw2)%mod;
    return anw;
}

void getPrime()
{
    bool flag[maxn];
    memset(flag,false,sizeof(flag));
    prime[0] = 0;
    for(int i = 2; i < maxn; i++)
    {
        if(flag[i] == false)
        {
            prime[++prime[0]] = i;
            for(int j = 1; j <= prime[0]&&prime[j]*i < maxn; j++)
            {
                flag[prime[j]*i] = true;
                if(i%prime[j] == 0)
                    break;
            }
        }
    }
}

void getFac()
{
    facCnt = 0;
    LL tmp = n;
    for(int i = 1; i <= prime[0] && prime[i]*prime[i] <= tmp; i++)
    {
        if(tmp % prime[i] == 0)
        {
            fac[facCnt++] = prime[i];
            while(tmp % prime[i] == 0)
                tmp /= prime[i];
        }
        if(tmp == 1) break;
    }
    if(tmp > 1)
        fac[facCnt++] = tmp;
}

int main()
{
    int test;
    scanf("%d",&test);
    getPrime();
    extend_gcd(30,mod,ni,nii);
    while(test--)
    {
        scanf("%I64d",&n);
        getFac();
        LL ans = 0;

        for(int i = 1; i < (1<<facCnt); i++)
        {
            LL mul = 1;
            int cnt = 0;
            for(int j = 0; j < facCnt; j++)
            {
                if(i&(1<<j))
                {
                    cnt++;
                    mul *= fac[j];
                }
            }
            if(cnt&1)
                ans = (ans + cal(mul) )%mod;
            else
                ans = (ans - cal(mul) )%mod;
        }
        ans = ((pow_4(n) - ans)%mod+mod)%mod; //减法时取余
        printf("%I64d\n",ans);
    }
    return 0;
}
时间: 2024-10-20 19:15:32

hdu 4059 The Boss on Mars(纳入和排除)的相关文章

数论 + 容斥 - HDU 4059 The Boss on Mars

The Boss on Mars Problem's Link Mean: 给定一个整数n,求1~n中所有与n互质的数的四次方的和.(1<=n<=1e8) analyse: 看似简单,倘若自己手动推公式的话,还是需要一定的数学基础. 总的思路:先求出sum1=(1^4)+(2^4)+...(n^4),再求出sum2=(1~n中与n不互质的数的四次方的和),answer=sum1-sum2. 如何求sum1呢? 有两种方法: 1.数列差分.由于A={Sn}={a1^4+a2^4+...an^4}

hdu 4059 The Boss on Mars

The Boss on Mars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1934    Accepted Submission(s): 580 Problem Description On Mars, there is a huge company called ACM (A huge Company on Mars), an

HDU 4059 The Boss on Mars(数论)

题目大意:给你一个n(10^8)以内,让你求出1-n中与n互质的数x^4的和. 解题思路:先把n进行分解质因数,然后容斥求出所有与n不互质的数x^4的和,然后做减法用总的减去不互质的就是互质的. 注意:1^4+2^4+--+n^4 = n(n+1)(2n+1)(3n^2+3n-1)/30. The Boss on Mars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot

hdu 4059 The Boss on Mars(容斥)

http://acm.hdu.edu.cn/showproblem.php?pid=4059 定义S = 1^4 + 2^4 + 3^4+.....+n^4,现在减去与n互质的数的4次方,问共减少了多少. 容斥原理,可以先把与n不互质的数的4次方求出来.那就先对n进行质因子分解,对质因子的组合运用容斥原理,质因子个数为奇数就加,偶数就减.其实与求[1,n]内与n互质的数的个数类似,该题重点是计算,防止乘法溢出. 对于求解1^4 + 2^4 + 3^4+.....+n^4,可以先类比1^2+2^2

HDU 4059 The Boss on Mars ( 容斥原理)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4059 题意: 给定一个数n求小于n的与n互斥的数的四次方的和. 分析: 我们可以求出从1~n的所有数的四次方的和sum1,然后容斥求出1~n所有与n不互斥的数的四次方的和sum2: ans =sum1 - sum2; 设f(n)表示从1~n的所有数的四次方的和 f(n)=1/30*n*(n+1)(2n+1)(3n^2+3n-1); 推倒如下: (n+1)^5-n^5=5n^4+10n^3+10n^

HDU 4059 The Boss on Mars-矩阵+容斥

错了29遍,终成正果..... 根据题意,很容易的可以想到容斥. 然后的问题就是如何求 sum(n)=1^4+2^4+3^4+....+n^4; 有三种道路: 很显然:1^4+2^4+3^4+....+n^4=(n^5)/5+(n^4)/2+(n^3)/3-n/30: 则1,用java的大数去敲这个的代码. 2,用c++敲,但是用到分数取模,求逆元. 3,用c++敲,但是不用这个公式,用矩阵去构造sum(n). 我用的是第三种.但是第三种有的缺陷,就是时间复杂度有点高. 接下来的问题就是如何优化

The Boss on Mars

The Boss on Mars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2327    Accepted Submission(s): 718 Problem Description On Mars, there is a huge company called ACM (A huge Company on Mars), and

HDU 1800 Flying to the Mars (水题)

Flying to the Mars Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11099    Accepted Submission(s): 3572 Problem Description In the year 8888, the Earth is ruled by the PPF Empire . As the popul

HDU 4059 容斥初步练习

1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 #define LL long long 6 using namespace std; 7 const LL Mod=1000000007; 8 const LL Maxn=60010; 9 LL Factor[35],cnt,n,m,tot,Rev,Kase,Prime[Maxn];