BZOJ 2671(Calc-数论反演)
2017-03-26 23:29
218 查看
Description
给出N,统计满足下面条件的数对(a,b)的个数:
1.1<=a
给出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 <<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; }
相关文章推荐
- 【BZOJ 2671】 2671: Calc (数论,莫比乌斯反演)
- BZOJ2671 Calc 【莫比乌斯反演】
- [BZOJ2671][莫比乌斯反演]Calc
- BZOJ 2671 Calc 数论
- [莫比乌斯反演 高斯消元 数学技巧] BZOJ 3601 一个人的数论
- 【数论】【莫比乌斯反演】【线性筛】bzoj2005 [Noi2010]能量采集
- 【bzoj 2506】calc(数论)
- bzoj 4176 Lucas的数论 莫比乌斯反演
- [数论 反演]BZOJ4816 [Sdoi2017]数字表格
- BZOJ4652 [Noi2016]循环之美 【数论 + 莫比乌斯反演 + 杜教筛】
- bzoj2154: Crash的数字表格/2693: jzptab [莫比乌斯反演、数论推导]
- 【BZOJ3601】一个人的数论 高斯消元+莫比乌斯反演
- 【数论】【枚举】【莫比乌斯反演】【线性筛】bzoj2818 Gcd
- BZOJ4176 Lucas的数论 【莫比乌斯反演 + 杜教筛】
- bzoj3994 约数个数和 数论&莫比乌斯反演
- [数论][莫比乌斯反演][杜教筛] BZOJ 3512: DZY Loves Math IV
- BZOJ 3601 一个人的数论 ——莫比乌斯反演 高斯消元
- 【bzoj2671】Calc 莫比乌斯函数
- [BZOJ2671] Calc和与积 - 容斥原理,莫比乌斯反演定理
- BZOJ 4176 Lucas的数论 莫比乌斯反演