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^2+5n+1

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

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

...

...

...

2^5-1^5=5*1^4+10*1^3+10*1^2+5*1+1

需要用到的公式有

1^2+2^2+...+n^2=n*(n+1)*(2*n+1)/6;

1^3+2^3+...+n^3=n^2*(n+1)^2/4;

然后全部相加起来,经行化简 就可以就可以得到f(n)

因为要取模,而且有除法因此我们需要求逆元

a^b=1(mod m)

这里介绍两种方法

1)

因为30与1000000007互斥 因此由费马小定理可知这是的逆元为(30^(mod-2))%(mod);

2)

a/b mod m = (a mod (m*b) )/m;

代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

const int mod = 1000000007;
typedef long long LL;

int cnt=0;
int a[50];
LL n,inv;
void fen(int n)//素因子分解
{
    cnt=0;
    for(int i=2;i*i<=n;i++){
        if(n%i==0){
            a[cnt++]=i;
            while(n%i==0)
                n/=i;
        }
    }
    if(n>1) a[cnt++]=n;
}

LL multi(LL a,LL b,LL m)
{
    LL ans = 0;
    while(b){
        if(b&1){
            ans = (ans + a)%m;
            b--;
        }
        b>>=1;
        a=a*2;
        if(a>n) a%=m;
    }
    return ans;
}

LL quick_mod(LL a,LL b,LL m)
{
    LL ans = 1;
    while(b){
        if(b&1){
            ans=multi(ans,a,m);
            b--;
        }
        b>>=1;
        a=multi(a,a,m);
    }
    return ans;
}

LL f(LL n)// 四次方和公式:1/30*n*(n+1)(2n+1)(3n^2+3n-1)
{
    LL ans=n;
    ans=(ans*(n+1))%mod;
    ans=(ans*(2*n+1))%mod;
    ans=(ans*((3*n*n+3*n-1)%mod))%mod;
    ans=(ans*inv)%mod;
    return ans;
}

LL solve(LL n)
{
    fen(n);
    LL ans = 0;
    for(int i=1;i<(1<<cnt);i++){
        LL tmp = 1;
        int tt = 0;
        for(int j=0;j<cnt;j++){
            if((1<<j)&i){
                tmp=tmp*a[j];
                tt++;
            }
        }
        LL q=n/tmp;
        LL t = multi(multi(tmp,tmp,mod),multi(tmp,tmp,mod),mod);
        if(tt&1)
            ans=(ans+multi(f(q),t,mod))%mod;
        else
            ans=(ans-multi(f(q),t,mod)+mod)%mod;
    }
    return ans;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%I64d",&n);
        if(n==1){
            puts("0");
            continue;
        }
        inv = quick_mod(30,mod-2,mod);
        LL tmp = f(n);
        LL ans = solve(n);
        ans=(tmp-ans+mod)%mod;
        printf("%I64d\n",ans);
    }
    return 0;
}
时间: 2024-11-05 11:23:12

HDU 4059 The Boss on Mars ( 容斥原理)的相关文章

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

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(数论)

题目大意:给你一个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 定义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^

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). 我用的是第三种.但是第三种有的缺陷,就是时间复杂度有点高. 接下来的问题就是如何优化

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/art

hdu4059---The Boss on Mars(容斥原理+前n项的4次方和)

Problem Description On Mars, there is a huge company called ACM (A huge Company on Mars), and it's owned by a younger boss. Due to no moons around Mars, the employees can only get the salaries per-year. There are n employees in ACM, and it's time for

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) //由容斥原理很容易得到与n不互质的数之和为 //对于所有的n的素数因子 //一个素数因子的所有数的四次方之和-有两个素数因子的所有数的四次方之和+有三个.... //然后用