BZOJ 2671(Calc-数论反演)

来源:互联网 发布:java socket异步接收 编辑:程序博客网 时间:2024/06/04 19:13

Description

  给出N,统计满足下面条件的数对(a,b)的个数:
  1.1<=a

#include<bits/stdc++.h> using namespace std;#define For(i,n) for(int i=1;i<=n;i++)#define Fork(i,k,n) for(int i=k;i<=n;i++)#define ForkD(i,k,n) for(int i=n;i>=k;i--)#define Rep(i,n) for(int i=0;i<n;i++)#define ForD(i,n) for(int i=n;i;i--)#define RepD(i,n) for(int i=n;i>=0;i--)#define Forp(x) for(int p=pre[x];p;p=next[p])#define Forpiter(x) for(int &p=iter[x];p;p=next[p])  #define Lson (o<<1)#define Rson ((o<<1)+1)#define MEM(a) memset(a,0,sizeof(a));#define MEMI(a) memset(a,0x3f,sizeof(a));#define MEMi(a) memset(a,128,sizeof(a));#define MEMx(a,b) memset(a,b,sizeof(a));#define INF (0x3f3f3f3f)#define F (1000000007)#define pb push_back#define mp make_pair#define fi first#define se second#define vi vector<int> #define pi pair<int,int>#define SI(a) ((a).size())#define Pr(kcase,ans) printf("Case #%d: %lld\n",kcase,ans);#define PRi(a,n) For(i,n-1) cout<<a[i]<<' '; cout<<a[n]<<endl;#define PRi2D(a,n,m) For(i,n) { \                        For(j,m-1) cout<<a[i][j]<<' ';\                        cout<<a[i][m]<<endl; \                        } #pragma comment(linker, "/STACK:102400000,102400000")#define ALL(x) (x).begin(),(x).end()typedef long long ll;typedef long double ld;typedef unsigned long long ull;ll add(ll a,ll b){return (a+b)%F;}ll sub(ll a,ll b){return ((a-b)%F+F)%F;}void upd(ll &a,ll b){a=(a%F+b%F)%F;}inline int read(){    int x=0,f=1; char ch=getchar();    while(!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}    while(isdigit(ch)) { x=x*10+ch-'0'; ch=getchar();}    return x*f;} #define MAXN (50500+10) typedef long long ll;int p[MAXN],tot;bool b[MAXN]={0};ll mul[MAXN],s[MAXN];void make_prime(int n){    tot=0; mul[1]=1;    Fork(i,2,n)    {        if (!b[i]) p[++tot]=i,mul[i]=-1;        For(j,tot)        {            if (i*p[j]>n) break;            b[i*p[j]]=1;            mul[i*p[j]]=-mul[i];            if (i%p[j]==0) {                mul[i*p[j]]=0;                break;            }          }    }    s[0]=0;    For(i,n) s[i]=s[i-1]+mul[i];}ll get_factor(vector<ll> &v,ll p) {    for(ll i=1;i*i<=p;i++) if (p%i==0) {        v.pb(i);        if (i*i<p) v.pb(p/i);    }    sort(v.begin(),v.end());}ll calc(ll n) {    ll a,b,k,ans=0,last;    vector<ll> v;    for(b=1;b*(b+1)<=n;++b) {        v.clear();        get_factor(v,b);        for(a=1;a<b&&(a+b)*b<=n;a=last+1) {            last=min(n/(n/b/(a+b))/b-b,b-1);            ll cnt=0;            for(int j=0;j<SI(v);j++) {                ll k=v[j];                cnt+=mul[k]*((last/k)-(a-1)/k);            }            ans+=n/b/(a+b)*cnt;        }    }    return ans;}int main(){//  freopen("bzoj2671.in","r",stdin);//  freopen(".out","w",stdout);    ll n;    cin>>n;    make_prime(50000);    calc(n);    cout<<calc(n)<<endl;    return 0;}
0 0
原创粉丝点击