Battlestation Operational(hdu6134 莫比乌斯反演)

来源:互联网 发布:怎么写数据报告 编辑:程序博客网 时间:2024/06/05 03:47

题目:点击打开链接

题意:f(n) = sigma[1<=i<=n]sigma[1<=j<=i]ceil[i/j] (gcd(i,j)==1)

sigma代表求和符号,celi代表除完向上取整;

解题:个人觉得这个代码还挺容易看懂的

点击打开链接

#include <bits/stdc++.h>using namespace std;typedef long long ll;const ll mod=1e9+7;const ll maxn=1e6+5;int mu[maxn],prime[maxn],not_prime[maxn];ll f[maxn],g[maxn],h[maxn];void mobius(){    ll tot;    mu[1] = 1;    tot = 0;    for(int i = 2; i < maxn; i++){        if(!not_prime[i]){            prime[++tot] = i;            mu[i] = -1;        }        for(int j = 1; prime[j]*i<maxn; j++){            not_prime[prime[j]*i] = 1;            if(i%prime[j]==0){                mu[prime[j]*i] = 0;                break;            }            mu[prime[j]*i] = -mu[i];        }    }}//莫比乌斯函数的模板void solve(){    memset(g,0,sizeof(g));    memset(h,0,sizeof(h));    memset(f,0,sizeof(f));    for(int i=1;i<=1e6;i++)    {        g[i]++;        for(int j=i+1;j<=1e6;j+=i)            g[j]++;    }    for(int i=2;i<=1e6;i++)    g[i]=(g[i]+g[i-1])%mod;    for(int i=1;i<=1e6;i++)    {        for(int j=i;j<=1e6;j+=i)        {            h[j]=(h[j]+mu[i]*g[j/i]%mod+mod)%mod;        }    }   // cout<<h[1]<<endl;    for(int i=1;i<=1e6;i++)    {        f[i]=(f[i-1]+h[i])%mod;    }}int main(){    int n;    mobius();    solve();    while(cin>>n)    {        cout<<f[n]<<endl;    }    return 0;}



                                                                                  



1],


阅读全文
0 0
原创粉丝点击