您的位置:首页 > 其它

hdu4059The Boss on Mars 容斥原理

2015-06-06 22:28 253 查看
//求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的素数因子

//一个素数因子的所有数的四次方之和-有两个素数因子的所有数的四次方之和+有三个。。。。

//然后用总的减去不互质的即为互质的

#include<cstdio>

#include<iostream>

#include<cstring>

using namespace std ;

const int maxn = 1010 ;

typedef __int64 ll ;

const __int64 mod = 1e9+7 ;

int p[maxn] ;

int len ;

ll inv ;

void get_prime(ll n)

{

len = 0 ;

for(int i = 2;i*i <= n;i++)

{

if(n%i == 0)p[++len] = i;

while(n%i==0)n/=i ;

}

if(n>1)p[++len] = n ;

}

ll Pow(ll a , ll b)

{

ll c = 1 ;

while(b)

{

if(b&1)c = (c*a)%mod;

a = (a*a)%mod;

b >>= 1;

}

return c ;

}

ll dfs(int pos , int n)

{

ll ans = 0 ;

for(int i = pos;i <= len ;i++)

{

ll t = n/p[i] ;

ll t_1 = ((((6*Pow(t,5) + 15*Pow(t,4) + 10*Pow(t,3) - t))%mod)*inv)%mod;

ans = (ans + (Pow(p[i] , 4)*(t_1- dfs(i+1 , n/p[i]))))%mod;

}

return ans ;

}

int main()

{

int T ;

scanf("%d" , &T) ;

inv = Pow(30 , mod - 2) ;

while(T--)

{

ll n ;

scanf("%I64d" , &n) ;

get_prime(n) ;

ll ans = (((((6*Pow(n,5) + 15*Pow(n,4) + 10*Pow(n,3) - n))%mod)*inv)%mod - dfs(1 , n))%mod ;

printf("%I64d\n" , (ans+mod)%mod);

}

return 0 ;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: