標籤:return sizeof 計算 ring iostream get img text ++
3529: [Sdoi2014]數表Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 1407 Solved: 699
[Submit][Status][Discuss]Description
有一張N×m的數表,其第i行第j列(1 < =i < =禮,1 < =j < =m)的數值為
能同時整除i和j的所有自然數之和。給定a,計算數表中不大於a的數之和。
Input
輸入包含多組資料。
輸入的第一行一個整數Q表示測試點內的資料群組數,接下來Q行,每行三個整數n,m,a(|a| < =10^9)描述一組資料。
Output
對每組資料,輸出一行一個整數,表示答案模2^31的值。
Sample Input 2
4 4 3
10 10 5
Sample Output 20
148HINT
1 < =N.m < =10^5 , 1 < =Q < =2×10^4
Source
Round 1 Day 1
分析:
論我的心情變化:勞資不陪你玩了,我還不信推不出來了--->TAT你贏了--->%PoPoQQQ...
大家都膜拜了Po姐,那我們也來膜拜一發...
首先公式恐懼症的我看到公式就GG,所以先把a的限制去掉...
定義F(i)代表i的約數之和...g(i)代表gcd(x,y)=i的數對個數...根據BZOJ1101我們可以得出g(i)的做法...
Σ(1<=i<=n) Σ(1<=j<=n) F(gcd(i,j)) (還是規定n<m)
=Σ(1<=i<=n) F(i)*g(i)
=Σ(1<=i<=n) F(i)*Σ(1<=x<=n/i) μ(x)*(n/i/x)*(m/i/x)
=Σ(1<=i<=n) F(i)*Σ(i|x&&x<=n) μ(x/i)*(n/x)*(m/x)
=Σ(1<=x<=n) (n/x)*(m/x)*Σ(i|x)μ(x/i)*F(i)
所以我們還是可以採用分段的思想...
先暴力的預先處理出F函數和μ函數,然後枚舉i,再枚舉i的倍數x,用樹狀數組維護首碼和...
現在加上了a的限制...那就離線,按照a從小到大排序...
代碼:
1 #include<algorithm> 2 #include<iostream> 3 #include<cstring> 4 #include<cstdio> 5 //by NeighThorn 6 using namespace std; 7 //大鵬一日同風起,扶搖直上九萬裡 8 9 const int maxn=100000+5,maxm=20000+5;10 11 int cas,cnt,Max,Mod=2147483647,tr[maxn],miu[maxn],vis[maxn],prime[maxn];12 13 struct M{14 int n,m,a,id;15 unsigned int ans;16 }q[maxm];17 18 struct N{19 int pos,val;20 }f[maxn];21 22 inline bool cmp1(M x,M y){23 return x.a<y.a;24 }25 26 inline bool cmp2(M x,M y){27 return x.id<y.id;28 }29 30 inline bool cmp3(N x,N y){31 return x.val<y.val;32 }33 34 inline void insert(int x,int y){35 for(;x<=Max;x+=x&(-x))36 tr[x]+=y;37 }38 39 inline int query(int x){40 int sum=0;41 for(;x;x-=x&(-x))42 sum+=tr[x];43 return sum;44 }45 46 signed main(void){47 scanf("%d",&cas);Max=0;48 for(int i=1;i<=cas;i++){49 scanf("%d%d%d",&q[i].n,&q[i].m,&q[i].a),q[i].id=i;50 if(q[i].n>q[i].m)51 swap(q[i].n,q[i].m);52 Max=max(Max,q[i].m);53 }miu[1]=1;cnt=0;54 memset(vis,0,sizeof(vis));55 for(int i=2;i<=Max;i++){56 if(!vis[i])57 vis[i]=1,prime[++cnt]=i,miu[i]=-1;58 for(int j=1;j<=cnt&&prime[j]*i<=Max;j++){59 vis[i*prime[j]]=1;60 if(i%prime[j]==0){61 miu[i*prime[j]]=0;break;62 }63 miu[i*prime[j]]=-miu[i];64 }65 }66 for(int i=1;i<=Max;i++){67 f[i].pos=i;68 for(int j=i;j<=Max;j+=i)69 f[j].val+=i;70 }71 sort(f+1,f+Max+1,cmp3);72 sort(q+1,q+cas+1,cmp1);73 int lala=0;74 for(int i=1;i<=cas;i++){75 while(lala+1<=Max&&f[lala+1].val<=q[i].a){76 lala++;77 for(int j=f[lala].pos;j<=Max;j+=f[lala].pos)78 insert(j,f[lala].val*miu[j/f[lala].pos]);79 }80 for(int j=1,r;j<=q[i].n;j=r+1){81 r=min(q[i].n/(q[i].n/j),q[i].m/(q[i].m/j));82 q[i].ans+=(query(r)-query(j-1))*(q[i].n/j)*(q[i].m/j);83 }84 q[i].ans&=Mod;85 }86 sort(q+1,q+cas+1,cmp2);87 for(int i=1;i<=cas;i++)88 printf("%u\n",q[i].ans);89 return 0;90 }View Code
By NeighThorn
BZOJ 3529: [Sdoi2014]數表