标签:des style blog http color io os ar java
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
题解及代码:
这道题目的综合性还是很强的。首先说一下题目,就是求小于n并且与n互素的数的四次方的和。
说一下思路吧:首先我们求出1---n-1的所有的数的四次方的和,之后将n进行素因子分解,求出n的所有因子,然后减去包含这些因子的数的四次方就可以了。
大体上的思路有了,来处理一下细节:1.首先我们要求出四次方和的公式 2.素数打表 3.求逆元(因为四次方和公式有一个分母,取余时要乘上逆元)
4.素因子分解 5.容斥原理
搞定这5步,我们这道题就能做了,所以说综合性非常强。
具体见代码吧:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const long long mod=1000000007,q=233333335;//p为逆元,用费马小定理求出 bool prime[10010]; int p[1400]; int k=0; //四次方和计算公式 long long cal(long long n) { if(n==0) return 0; return (n*(n+1)%mod*(2*n+1)%mod)%mod*((3*n*n+3*n-1)%mod*q%mod)%mod; } //容斥原理 void dfs(int base,int num_p,long long n,long long m,long long nt,long long mu,long long &sum,long long tab_p[]) { if(nt==m) { long long b=n/mu; if(m%2==0) { sum=(sum-mu*mu%mod*mu%mod*mu%mod*cal(b)%mod+mod)%mod; } else { sum=(sum+mu*mu%mod*mu%mod*mu%mod*cal(b)%mod)%mod; } return; } for(long long i=base; i<num_p; i++) { dfs(i+1,num_p,n,m,nt+1,mu*tab_p[i],sum,tab_p); } } //素数打表 void isprime() { long long i,j; memset(prime,true,sizeof(prime)); prime[0]=prime[1]=false; for(i=2; i<10010; i++) { if(prime[i]) { p[k++]=i; for(j=i*i; j<10010; j+=i) prime[j]=false; } } } int main() { isprime(); long long n,ans,tab_p[1400]; int cas; scanf("%d",&cas); while(cas--) { scanf("%I64d",&n); n=n-1; ans=cal(n); long long m=n,t=n+1; int num_p=0; for(int i=0; i<k&&p[i]*p[i]<=t; i++) //素因子分解 if(t%p[i]==0) { tab_p[num_p++]=p[i]; while(t%p[i]==0) { t/=p[i]; } } if(t>1) tab_p[num_p++]=t; /*//输出测试 for(int i=0;i<num_p;i++) { printf("%d ",tab_p[i]); } puts(""); //测试结束 */ long long sum=0; for(int i=0; i<num_p; i++) //将不互素的部分减去 { n=m/tab_p[i]; sum=(sum+tab_p[i]*tab_p[i]%mod*tab_p[i]%mod*tab_p[i]%mod*cal(n))%mod; } for(long long i=2; i<=num_p; i++) //容斥部分求解 dfs(0,num_p,m,i,0LL,1LL,sum,tab_p); printf("%I64d\n",(ans-sum+mod)%mod); } return 0; }
标签:des style blog http color io os ar java
原文地址:http://blog.csdn.net/knight_kaka/article/details/40151921