HDU 6134 Battlestation Operational
2017-08-29 10:12
393 查看
题意:
求 f(n)=∑i=1n∑j=1i⌈ij⌉[(i,j)=1]
思路:
比赛的时候不会写,看了别人的博客半天才看懂,看来理解还是不够深啊
这里就不推导了
重新对欧拉函数,莫比乌斯函数,还有那个因子数的积性有了新的理解
欧拉函数:
我们知道
由于欧拉筛法,每次我们都遍历一个素数 j
如果 n%j==0 说明 n中存在素因子j ,那么在euler
中已经乘过(1 - (1/j))
euler
= n*(1 - (1/j))*k
euler[n*j] = n*j*(1-(1/j))*k = euler
*j
如果n%j!=0 ,那么说明 n,j互素
euler[n*j]=euler
*euler[j]= euler
*(j-1)
莫比乌斯函数:
同样由于欧拉筛法,每次我们都遍历一个素数 j
如果 n%j ==0 说明 n中存在素因子j,那么u[j*n]=0;
如果 n%j!=0 说明 n中不存在素因子j ,那么u[j*n]=-u
;
因子数:
因子数=(1 + e1) * (1 + e2) *
... * (1 + ek)
如果 n%j!=0 说明 n中不存在素因子j ,j与n互素,那么d[j*n]=d
*(1+1);
如果 n%j ==0 说明 n中存在素因子j,这种情况要好好想想
由于欧拉筛法,素数
j是n的最小的一个素因子
n*j=(n/(j^k))*(j^(k+1))
d[j*n] = d[(n/(j^k))]*
d[(j^(k+1))];
由于欧拉筛法,素数 j是n的最小的一个素因子
(j^k)与
n是一个一一对应的关系
令temp
=(j^k);
d[j*n]
= d[ n/temp
]* (d[temp
]+1);
于是对于temp[n]
如果 n%j!=0 说明 n中不存在素因子j , temp[n*j]=temp[n]
* j;
如果 n%j ==0 说明 n中存在素因子j,此时j是n*j最小的素因子 temp[n*j]=j;
过题代码
求 f(n)=∑i=1n∑j=1i⌈ij⌉[(i,j)=1]
思路:
比赛的时候不会写,看了别人的博客半天才看懂,看来理解还是不够深啊
这里就不推导了
重新对欧拉函数,莫比乌斯函数,还有那个因子数的积性有了新的理解
欧拉函数:
我们知道
由于欧拉筛法,每次我们都遍历一个素数 j
如果 n%j==0 说明 n中存在素因子j ,那么在euler
中已经乘过(1 - (1/j))
euler
= n*(1 - (1/j))*k
euler[n*j] = n*j*(1-(1/j))*k = euler
*j
如果n%j!=0 ,那么说明 n,j互素
euler[n*j]=euler
*euler[j]= euler
*(j-1)
if(i%prime[j]==0) { euler[i*prime[j]]=euler[i]*prime[j]; break; } euler[i*prime[j]]=euler[i]*(prime[j]-1);
莫比乌斯函数:
同样由于欧拉筛法,每次我们都遍历一个素数 j
如果 n%j ==0 说明 n中存在素因子j,那么u[j*n]=0;
如果 n%j!=0 说明 n中不存在素因子j ,那么u[j*n]=-u
;
if(i%prime[j]==0) { mu[i*prime[j]]=0; break; } mu[i*prime[j]]=-mu[i];
因子数:
因子数=(1 + e1) * (1 + e2) *
... * (1 + ek)
如果 n%j!=0 说明 n中不存在素因子j ,j与n互素,那么d[j*n]=d
*(1+1);
如果 n%j ==0 说明 n中存在素因子j,这种情况要好好想想
由于欧拉筛法,素数
j是n的最小的一个素因子
n*j=(n/(j^k))*(j^(k+1))
d[j*n] = d[(n/(j^k))]*
d[(j^(k+1))];
由于欧拉筛法,素数 j是n的最小的一个素因子
(j^k)与
n是一个一一对应的关系
令temp
=(j^k);
d[j*n]
= d[ n/temp
]* (d[temp
]+1);
于是对于temp[n]
如果 n%j!=0 说明 n中不存在素因子j , temp[n*j]=temp[n]
* j;
如果 n%j ==0 说明 n中存在素因子j,此时j是n*j最小的素因子 temp[n*j]=j;
if(i%prime[j]==0) { temp[i*prime[j]]=prime[j]*temp[i]; d[i*prime[j]]=d[i/temp[i]]*(d[temp[i]]+1); break; } temp[i*prime[j]]=prime[j]; d[i*prime[j]]=2*d[i];
过题代码
#include<bits/stdc++.h> using namespace std; #define maxn 1000005 #define mod 1000000007 typedef long long ll; int prime[maxn],mu[maxn],euler[maxn],res,d[maxn],temp[maxn],ans[maxn]; void mo() { mu[1]=euler[1]=d[1]=1; res=0; for(int i=2;i<maxn;i++) { if(!temp[i]) { temp[i]=i; euler[i]=i-1; mu[i]=-1; prime[res++]=i; d[i]=2; } for(int j=0;j<res&&i*prime[j]<maxn;j++) { if(i%prime[j]==0) { mu[i*prime[j]]=0; euler[i*prime[j]]=euler[i]*prime[j]; temp[i*prime[j]]=prime[j]*temp[i]; d[i*prime[j]]=d[i/temp[i]]*(d[temp[i]]+1); break; } mu[i*prime[j]]=-mu[i]; euler[i*prime[j]]=euler[i]*(prime[j]-1); temp[i*prime[j]]=prime[j]; d[i*prime[j]]=2*d[i]; } } for(int i=2;i<maxn;i++) d[i]+=d[i-1]; for(int i=1;i<maxn;i++) for(int j=i;j<maxn;j+=i) if(mu[j/i]!=0) ans[j]=(ans[j]+(mu[j/i]*d[i])%mod)%mod; for(int i=1;i<maxn;i++) ans[i]=((ans[i]+ans[i-1])%mod+euler[i]-1)%mod; } int main() { mo(); int n; while(~(scanf("%d",&n))) cout<<ans <<endl; return 0; }
相关文章推荐
- HDU 6134 Battlestation Operational
- hdu 6134 Battlestation Operational 莫比乌斯反演
- HDU 6134 Battlestation Operational-莫比乌斯
- 2017多校第8场 HDU 6134 Battlestation Operational 莫比乌斯反演
- HDU 6134 Battlestation Operational(莫比乌斯反演+线性筛)
- HDU 6134 Battlestation Operational(基本数论+莫比乌斯反演)——2017 Multi-University Training Contest - Team 8
- hdu 6134 Battlestation Operational [反演]【数学】
- HDU 6134 Battlestation Operational(莫比乌斯反演)
- 2017多校八 1002题 hdu 6134 Battlestation Operational 艾弗森约定 莫比乌斯函数 分块
- HDU 6134 Battlestation Operational | 2017 Multi-University Training Contest 8
- HDU 6134 Battlestation Operational 2017多校8 莫比乌斯反演
- Hdu 6134 Battlestation Operational【容斥】
- 解题报告:HDU_6134:Battlestation Operational (莫比乌斯反演)
- HDU 6134(2017 多校训练:Battlestation Operational(莫比乌斯反演))
- hdu 6134 Battlestation Operational 莫比乌斯反演
- HDU 6134 && 2017 多校训练:Battlestation Operational(莫比乌斯反演+积性函数)
- hdu 6134 Battlestation Operational (莫比乌斯反演+线性筛法+差分)
- HDU 6134 Battlestation Operational(积性函数+莫比乌斯反演)
- HDU 6134 Battlestation Operational (mobius +前缀和)
- HDU-2017 多校训练赛8-1002-Battlestation Operational