BZOJ 3529: [Sdoi2014]數表

來源:互聯網
上載者:User

標籤: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
148
HINT

 

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]數表

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.