bzoj1101(莫比乌斯反演)

来源:互联网 发布:淘宝客推广加权重吗 编辑:程序博客网 时间:2024/05/18 01:47

比上题简单多了,关键还是数据小管用。。

不过这道题,卡时卡的太紧了


#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>using namespace std;typedef long long  ll;const int N=50005;ll n,m,d;int u[N+10],p[N+10],sum[N+10];bool b[N+10];void init(){sum[1]=u[1]=1;for (int i=2;i<=N;i++){if (!b[i]){p[++p[0]]=i;u[i]=-1;}for (int j=1;j<=p[0]&&p[j]*i<=N;j++){b[i*p[j]]=true;if (i%p[j]==0){u[i*p[j]]=0;break;}else u[p[j]*i]=-u[i];}sum[i]=sum[i-1]+u[i];}}ll work(ll n,ll m){if (n>m) swap(n,m);ll ans=0;for (int l=1,r;l<=n;l=r+1){r=min(n/(n/l),m/(m/l));ans+=(sum[r]-sum[l-1])*(n/l)*(m/l);}return ans;}inline ll read(){ll ans,f=1;char ch;while ((ch=getchar())<'0'||ch>'9') if (ch=='-') f=-1;ans=ch-'0';while ((ch=getchar())>='0'&&ch<='9') ans=ans*10+ch-'0';return ans*f;}int main(){ll T;init();T=read();while (T--){n=read();m=read();d=read();printf("%lld\n",work(n/d,m/d));}return 0;}



总结:

首先对一些常数需要进行潜在的关注

1:能用int,就不要用long long,测试的时候发现long long 比int慢一倍,有的时候就可能TLE

2:读入优化保平安。不过读入优化只快了200ms,而int比long long快了6000ms。。。。。。。。。。。。。



0 0
原创粉丝点击