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
- BZOJ 2671(Calc-数论反演)
- BZOJ 2671 Calc 数论
- BZOJ_P2671 Calc(数论+莫比乌斯反演)
- 【BZOJ 2671】Calc
- bzoj 2671: Calc 数学
- bzoj 4176: Lucas的数论 (反演)
- [数论 反演] BZOJ 4833 最小公倍佩尔数
- BZOJ 4176 Lucas的数论 莫比乌斯反演
- bzoj 4176 Lucas的数论 莫比乌斯反演
- [数论][莫比乌斯反演] BZOJ 4816: 数字表格
- bzoj2671 Calc 数论
- bzoj 2506 calc 题解
- BZOJ 2506 calc
- bzoj 2655: calc
- BZOJ 2655 calc
- [数论 反演] HDU6053. TrickGCD
- [BZOJ2671][莫比乌斯反演]Calc
- BZOJ 3601 一个人的数论 莫比乌斯反演+高斯消元
- Android基础知识07
- 226. Invert Binary Tree
- BaseAdapter的封装和实现
- spring boot csrf
- SurfaceView、SurfaceHolder与Surface
- BZOJ 2671(Calc-数论反演)
- 下载网页
- Lintcode 罗马数字转整数
- 蓝桥杯 历届试题 错误票据
- Android基础知识08
- 几种常见的简单排序
- 写一个函数判断一年是不是闰年
- 父类实现了序列化,如何阻止子类可以序列化?
- ARM 简单概念