标签:des style blog http io ar color os sp
题目大意:给你一个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.
2 4 5
82 354HintCase1: sum=1+3*3*3*3=82 Case2: sum=1+2*2*2*2+3*3*3*3+4*4*4*4=354
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <iomanip>
#include <stdio.h>
#include <string>
#include <queue>
#include <cmath>
#include <stack>
#include <map>
#include <set>
#define eps 1e-8
#define M 1000100
#define LL long long
//#define LL long long
#define INF 0x3f3f3f
#define PI 3.1415926535898
#define mod 1000000007
const int maxn = 110;
using namespace std;
///bool f[maxn];
int num[maxn];
int ans;
void Find(LL n)
{
ans = 0;
for(int i = 2; i*i <= n; i++)
{
if(n%i==0)
{
num[ans++] = i;
while(n%i == 0) n /= i;
}
}
if(n > 1) num[ans++] = n;
}
LL fastmod(LL a, LL k)
{
LL b = 1LL;
while(k)
{
if(k&1) b = a*b%mod;
a = (a%mod)*(a%mod)%mod;
k /= 2;
}
return b;
}
LL Pow(LL n, int k)
{
LL ff = 1LL;
for(int i = 0; i < k; i++)
{
ff *= n;
if(ff > mod) ff %= mod;
}
return ff%mod;
}
LL Get(LL n)
{
LL sum = n*(n+1)%mod;
sum %= mod;
sum *= (2*n+1)%mod;
sum %= mod;
sum *= ((3*(n*n%mod))%mod+((3*n)%mod)-1)%mod;
sum %= mod;
LL sp = fastmod(30, mod-2);
sum *= sp;
sum %= mod;
return sum;
}
int main()
{
int T;
cin >>T;
while(T--)
{
LL n;
scanf("%I64d",&n);
Find(n);
LL sum = 0;
LL xsum;
LL xans = Get(n);
for(int i = 1; i < (1<<ans); i++)
{
LL sx = 1;
int s = 0;
for(int j = 0; j < ans; j++)
{
if(i&(1<<j))
{
sx *= num[j];
s ++;
}
}
if(s%2)
{
xsum = Pow(sx, 4);
xsum %= mod;
sum += (xsum*Get(n/sx))%mod;
sum %= mod;
}
else
{
xsum = Pow(sx, 4);
xsum %= mod;
sum -= (xsum*Get(n/sx))%mod;
sum %= mod;
while(sum < 0) sum += mod;
}
}
if(n == 1)
{
cout<<0<<endl;
continue;
}
xans -= sum;
while(xans < 0) xans += mod;
printf("%I64d\n",xans%mod);
}
}
标签:des style blog http io ar color os sp
原文地址:http://blog.csdn.net/xu12110501127/article/details/41344333