SPOJ LCM Sum(积性函数递推+预处理)
2016-09-04 12:56
423 查看
求∑ni=1lcm(i,n),T组询问
∑ni=1i∗ngcd(i,n)=∑d|nn∗d∗n2d∗phi(nd)d=∑d|nn∗d∗phi(d)2
然而上面的化简用到1−n以内和n互质的数字的和等于n∗phi(n)2
然后d=n的时候,上面的式子就不能那么算了,因为1∗phi(1)/2=0,但是其实互质的数字和是1
所以∑d|nn∗d∗phi(d)2,d=1的时候,要另外算
然后怎么算这个式子呢,O(n)的预处理phi,然后O(nlogn)的筛因子
对于每个因子,去它的倍数里加上那个就行了
代码:
∑ni=1i∗ngcd(i,n)=∑d|nn∗d∗n2d∗phi(nd)d=∑d|nn∗d∗phi(d)2
然而上面的化简用到1−n以内和n互质的数字的和等于n∗phi(n)2
然后d=n的时候,上面的式子就不能那么算了,因为1∗phi(1)/2=0,但是其实互质的数字和是1
所以∑d|nn∗d∗phi(d)2,d=1的时候,要另外算
然后怎么算这个式子呢,O(n)的预处理phi,然后O(nlogn)的筛因子
对于每个因子,去它的倍数里加上那个就行了
代码:
#include <map> #include <set> #include <stack> #include <queue> #include <cmath> #include <string> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <sstream> #include <cstdlib> #include <iostream> #include <algorithm> #pragma comment(linker,"/STACK:102400000,102400000") using namespace std; #define MAX 1000005 #define MAXN 1000005 #define maxnode 205 #define sigma_size 2 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define lrt rt<<1 #define rrt rt<<1|1 #define middle int m=(r+l)>>1 #define LL long long #define ull unsigned long long #define mem(x,v) memset(x,v,sizeof(x)) #define lowbit(x) (x&-x) #define pii pair<int,int> #define bits(a) __builtin_popcount(a) #define mk make_pair #define limit 10000 //const int prime = 999983; const int INF = 0x3f3f3f3f; const LL INFF = 0x3f3f; //const double pi = acos(-1.0); const double inf = 1e18; const double eps = 1e-9; const LL mod = 1e9+7; const ull mx = 133333331; /*****************************************************/ inline void RI(int &x) { char c; while((c=getchar())<'0' || c>'9'); x=c-'0'; while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; } /*****************************************************/ bool prime[MAX]; int pr[MAX]; int tot; int phi[MAX]; LL g[MAX]; void init(){ mem(prime,0);tot=0; mem(g,0); phi[1]=1; for(int i=2;i<MAX;i++){ if(!prime[i]){ pr[tot++]=i; phi[i]=i-1; } for(int j=0;j<tot&&pr[j]*i<MAX;j++){ prime[pr[j]*i]=1; if(i%pr[j]==0){ phi[i*pr[j]]=phi[i]*pr[j]; break; } phi[pr[j]*i]=phi[i]*phi[pr[j]]; } } for(int i=1;i<MAX;i++){ for(int j=i;j<MAX;j+=i){ LL tmp=(LL)j*i*phi[i]; if(i!=1) g[j]+=tmp/2; else g[j]+=tmp; } } } int main(){ //freopen("in.txt","r",stdin); int t; cin>>t; init(); while(t--){ int n; scanf("%d",&n); printf("%lld\n",g ); } return 0; }
相关文章推荐
- SPOJ LCMSUM (数论)
- SPOJ LCMSUM (数论)
- SPOJ LCMSUM&GCDEX
- BZOJ 2226: [Spoj 5971] LCMSum( 数论 )
- SPOJ (BNUOJ) LCM Sum
- bzoj 2226: [Spoj 5971] LCMSum线性筛欧拉函数
- bzoj2226 [Spoj 5971] LCMSum(反演(互质数之和的公式))
- spoj LCMSUM
- [BZOJ2226][Spoj 5971] LCMSum(莫比乌斯反演)
- 【SPOJ】【P5971】【LCM Sum】【题解】【数论】
- BZOJ 2226: [Spoj 5971] LCMSum(数论+欧拉函数)
- Minimum Sum LCM 唯一分解定理+求质因数UVA - 10791
- UVa 10791 - Minimum Sum LCM 质因数分解加素数筛优化
- 唯一分解定理(Minimum Sum LCM,Uva10791)
- 【bzoj2226】【spoj5971】【lcmsum】【数论】
- LeetCode-18-4Sum 预处理+暴力+字典灵活用法
- UVA 10791(p317)----Minimum Sum LCM
- uva 10791 Minimum Sum LCM
- BZOJ2226 & SPOJ5971:LCMSum——题解
- UVa 10791 Minimum Sum LCM (数论&素因子分解)