您的位置:首页 > 其它

hdu 4059 The Boss on Mars

2012-10-11 23:15 501 查看
题意

  求1到之间所有与n互质的数的四次幂之和。

分析

  分解n^5-(n-1)^5..可以求出1^4+2^4+...+n^4的公式S(n)=1/30*(n^5+15*n^2*(n+1)^2-10*n*(n+1)*(2*n+1)+15*n*(n+1)-6*n)

  先求出S(n),利用容斥原理去掉是n的质因子的倍数的数的四次幂之和。。。

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define N 100100
#include<cstdio>
using namespace std;
typedef long long ll;
const ll mod=1000000007;
bool p
;
int s
;
vector<int>factor;
void prime(){
memset(p,1,sizeof(p));
for(int i=2;i*i<N;i++)
for(int j=i;i*j<N;j++)
p[i*j]=0;
s[0]=0;
for(int i=2;i<N;i++)
if(p[i])s[++s[0]]=i;
}

ll exgcd(int a,int b,ll &x,ll &y){
if(b==0){
x=1;
y=0;
return a;
}
ll d=exgcd(b,a%b,x,y);
ll t=x;
x=y;
y=t-(a/b)*y;
return d;
}
void div(ll n){          //分解因式
factor.clear();
for(int i=1;s[i]*s[i]<=n;i++){
if(n%s[i]==0){
factor.push_back(s[i]);
while(n%s[i]==0)n/=s[i];
}
}
if(n>1)factor.push_back(n);
}

ll calsum(ll n){
ll a1=6*(n*n%mod)*(n*n%mod)%mod*n%mod;
ll a2=15*n%mod*n%mod*(n+1)%mod*(n+1)%mod;
ll a3=10*n%mod*(n+1)%mod*(2*n+1)%mod;
ll a4=15*n%mod*(n+1)%mod;
ll a5=6*n%mod;
ll ans=(a1+a2-a3+a4-a5)%mod;
return ans;
}
ll sum(ll n){     //求和
ll ans=calsum(n);
ll x,y;
ll d=exgcd(30,mod,x,y);
x*=ans;
x=(x%mod+mod)%mod;
return x;
}

ll Mod(ll a,ll b){
return a*a%mod*a%mod*a%mod*b%mod;
}

void solve(ll n){
div(n);
ll ans=sum(n);
int c=factor.size();
for(int i=1;i<(1<<c);i++){//容斥原理
ll num=1;
int a=0;
int cnt=0;
int ii=i;
while(ii>0){
if(ii&1){
num*=factor[cnt];
++a;
}
ii>>=1;
++cnt;
}
ll cc=Mod(num,sum(n/num));
if(a&1){
ans=(ans-cc+mod)%mod;
}else{
ans=(ans+cc)%mod;
}
}
cout<<ans<<endl;
}

int main(){
//    freopen("test.out","w",stdout);
ll n,m;
int t;
prime();
cin>>t;
while(t--){
cin>>n;
solve(n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: