HYSBZ - 1101——莫比烏斯反演

【題目描述】
HYSBZ - 1101
在這里插入圖片描述
【題目分析】
昨天測試出了一道差不多的題目,我只能想到暴力,各種優化,最后都是運行了好久TLE,最后才知道要用到莫比烏斯反演,就想著今天研究一下,得出的結論就是,我可能研究不來。。。
//要用到數論的知識,我連人家的基本的定義都理解不了,更不要說證明了。現在只能說學會用吧,我知道這里的莫比烏斯反演可以快速求出[1,n]和[1,m]中所有互質的數字的數目,當作板子用了吧。

這兩天研究了一下數論函數,回來再看這道入門題覺得。。。
學習了一下除法分塊,具體的那個推導我還是沒有理解,但是大概知道怎么用了。

首先因為要求的是gcd(x,y)=d的,我們就要想到轉換成互質來做(很多都是這樣,因為互質有很多性質有很多函數我們可以進行處理),即求所有的gcd(x,y)=1,其中1<=x<=a/d,1<=y<=b/d,關于等于1的等式我們要聯想到元函數,然后進行用莫比烏斯函數和恒等函數卷積展開(就是著名的莫比烏斯反演,其實只是卷積中很簡單的一種。)再根據和式的性質:求的是所有能夠整除gcd(i,j)(1<=i<=a/d,1<=j<=b/d)的數字k的莫比烏斯函數和,我們從k的角度來看,對于每一個k,能夠同時被他整除的個數為(a/d/k) * (b/d/k),而且k的取值范圍是1<=k<=min(a/d,b/d),所以我們將式子的形式改變一下就得到對k進行求和的式子,然后用除法分塊處理,最后的時間復雜度應該是O(sqrt(n))

自己實現了一下,直接A了。
【AC代碼】

#include<cstdio>
#include<cstring>
#include<cmath>
#include<climits>#include<algorithm>using namespace std;typedef long long ll;int a,b,k;
int ans;
const int MAXN=50005;
const int MAXM=10005;
int prime[MAXN+5];
int check[MAXN+5];
int mobi[MAXN+5];
int sum[MAXN+5];
int tot=0;void creat_prime()
{mobi[1]=1;for(int i=2;i<MAXN;i++){if(check[i]==0){prime[tot++]=i;mobi[i]=-1;	}for(int j=0;j<tot&&prime[j]*i<MAXN;j++){check[prime[j]*i]=1;if(i%prime[j]==0){mobi[prime[j]*i]=0;break;}else{mobi[prime[j]*i]=-mobi[i];}}}for(int i=1;i<=MAXN;i++){sum[i]=sum[i-1]+mobi[i];}
}int solve(int n,int m)
{n/=k; m/=k;if(n>m) swap(n,m); if(n==0) return 0;int next,next1,next2;int tot=0;for(int i=1;i<=n;i=next){next1=n/(n/i); next2=m/(m/i);next=min(next1,next2);tot+=(n/i)*(m/i)*(sum[next]-sum[i-1]);next++;}return tot;
}int main()
{creat_prime();//check[2]=1;int T,u,v,w,flag;scanf("%d",&T);while(T--){ans=0;scanf("%d%d%d",&a,&b,&k);ans=solve(a,b);//這里有可能需要用容斥來計算其他區間的互質的數目,比如如果計算的是[a,b]和[c,d],那么ans=solve(b,d)-solve(a-1,d)-solve(b,c-1)+solve(a-1,c-1);printf("%d\n",ans);}return 0;
}

自己實現的代碼:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<ctime>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
using namespace std;typedef long long ll;
const int INF=0x3f3f3f3f;
const int MAXN=5e4+5;int prime[MAXN],mobius[MAXN],sum[MAXN];
bool check[MAXN];
int tot;void pre()
{tot=0; mobius[1]=1; sum[1]=1;for(int i=2;i<MAXN;i++){if(!check[i]){prime[tot++]=i; mobius[i]=-1;}for(int j=0;j<tot && prime[j]*i<MAXN;j++){check[prime[j]*i]=true;if(i%prime[j]) mobius[prime[j]*i]=-mobius[i];else{mobius[prime[j]*i]=0; break;}}sum[i]=sum[i-1]+mobius[i];}
}int main()
{pre();int T; int a,b,d;scanf("%d",&T);while(T--){int ans=0;scanf("%d%d%d",&a,&b,&d);a/=d; b/=d;int l,r;int limit=min(a,b);for(l=1;l<=limit;l=r+1){r=min(a/(a/l),b/(b/l));ans+=(sum[r]-sum[l-1])*(a/l)*(b/l);}printf("%d\n",ans);}return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/384102.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/384102.shtml
英文地址,請注明出處:http://en.pswp.cn/news/384102.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux下I/O多路轉接之select --fd_set

http://blog.csdn.net/li_ning_/article/details/52165993 fd_set 你終于還是來了&#xff0c;能看到這個標題進來的&#xff0c;我想&#xff0c;你一定是和我遇到了一樣的問題&#xff0c;一樣的疑惑&#xff0c;接下來幾個小時&#xff0c;我一定竭盡全力&#xff0c;寫出我…

BZOJ 2844 | HYSBZ - 2844albus就是要第一個出場——線性基

【題目描述】 BZOJ 2844 | HYSBZ - 2844albus 【題目分析】 題目的意思大概是給一個數列&#xff0c;他有2n個子集&#xff0c;每個子集的元素的異或和構成新的一個數列&#xff0c;排序后問數字Q在這個序列里面的下標。 假如題目是求所有元素的異或和構成一個集合就好弄了&…

CodeForces - 641ELittle Artem and Time Machine——map+樹狀數組

【題目描述】 CodeForces - 641ELittle Artem and Time Machine 【題目分析】 題目的意思大概是有三種操作 1.在時間t加入一個數字x 2.在時間t刪除一個數字x 3.詢問在時間t集合里面x的個數 雖然題目描述很簡單&#xff0c;但是t和x的范圍都是109&#xff0c;我一開始想到的是主…

I/O多路轉接之poll 函數

http://blog.csdn.net/li_ning_/article/details/52167224 poll 一、poll()函數&#xff1a; 這個函數是某些Unix系統提供的用于執行與select()函數同等功能的函數&#xff0c;自認為poll和select大同小異&#xff0c;下面是這個函數的聲明&#xff1a; [cpp] view plaincopy …

鏈表相關筆試面試題

1.判斷兩個鏈表是否相交 兩個鏈表是否相交可分為以下幾種情況 ????&#xff08;1&#xff09;兩個鏈表都不帶環&#xff0c;此時兩個鏈表所對應的最后一個節點是相等的 ????&#xff08;2&#xff09;兩個鏈表一個帶環&#xff0c;一個不帶環&#xff0c;兩個鏈表一定…

Linux經典問題—五哲學家就餐問題

http://m.blog.csdn.net/aspenstars/article/details/70149038 一、問題介紹 由Dijkstra提出并解決的哲學家進餐問題(The Dinning Philosophers Problem)是典型的同步問題。該問題是描述有五個哲學家共用一張圓桌&#xff0c;分別坐在周圍的五張椅子上&#xff0c;在圓桌上有五…

修改之前的myshell使之支持輸入輸出重定向

1.open函數 ????這個函數是打開一個文件&#xff08;文件名叫pathname),以 flag 權限打開&#xff0c;flag 包括了以下幾種 O_RDONLY&#xff08;只讀&#xff09;, O_WRONLY&#xff08;只寫&#xff09;, O_RDWR&#xff08;讀寫&#xff09;&#xff0c;當文件打開成…

HDU - 6621 K-th Closest Distance——主席樹+二分

【題目描述】 HDU - 6621 K-th Closest Distance 【題目分析】 因為看到第kkk大的要求&#xff0c;剛開始的時候一直都在想怎么運用第kkk大來解決問題&#xff0c;但是后來看其他人的博客才發現并不需要用第k大&#xff0c;但是主席樹維護權值線段樹還是需要的&#xff0c;這…

鏈表相關的算法題大匯總 — 數據結構之鏈表奇思妙想

http://blog.csdn.net/lanxuezaipiao/article/details/22100021基本函數&#xff08;具體代碼實現見后面&#xff09; 1&#xff0c;構造節點 //定義節點類型 struct Node { int value; Node*next; }; 2&#xff0c;分配節點 //之所以要分配節點原因是需要在分配函數中…

CodeForces - 372CWatching Fireworks is Fun+DP+單調隊列優化

【題目描述】 CodeForces - 372CWatching Fireworks is Fun 題目的大概意思就是在一個編號為1…n的街道上現在按照時間順序放煙花&#xff0c;每個煙花獲得的幸福感為b?abs(a?x)b-abs(a-x)b?abs(a?x)&#xff0c;x為觀看煙花的位置&#xff0c;為了提升我們的幸福感&#x…

雙向鏈表的基本操作

1.雙向鏈表的數據結構 typedef char DLinkType;typedef struct DLinkNode { DLinkType data; struct DLinkNode* next; struct DLinkNode* prev; }DLinkNode; 雙向帶頭結點的鏈表有三個成員&#xff0c; 一個是數據&#xff0c; 一個是指針 next 指向當前結點的下一個結點&…

匿名管道

1.進程通信的目的 (1) 數據傳輸: 一個進程需要將它的數據傳輸給另一個進程 ????(2) 資源共享: 多個進程之間共享同樣的資源 ????(3) 通知事件: 一個進程需要向另一個或一組進程發送消息, 通知它們發生了什么事情 2.管道 管道是一種進程之間通信的一種方式, 我們把從…

Currency Exchange——最短路Bellman-Ford算法

【題目描述】 Several currency exchange points are working in our city. Let us suppose that each point specializes in two particular currencies and performs exchange operations only with these currencies. There can be several points specializing in the sam…

C++實現String類

http://blog.csdn.net/randyjiawenjie/article/details/6709539 C實現String類&#xff0c;還沒有完成&#xff0c;待繼續。 有以下注意的點&#xff1a; &#xff08;1&#xff09;賦值操作符返回的是一個MyString&&#xff0c;而重載的返回的是一個MyString。其中的原因…

POJ 3370 Halloween treats——鴿巢原理+思維

【題目描述】 POJ 3370 Halloween treats Description Every year there is the same problem at Halloween: Each neighbour is only willing to give a certain total number of sweets on that day, no matter how many children call on him, so it may happen that a chi…

將信號量代碼生成靜態庫以及動態庫

1.信號量相關代碼生成靜態庫 2.信號量相關代碼生成動態庫

Wormholes——Bellman-Ford判斷負環

【題目描述】 While exploring his many farms, Farmer John has discovered a number of amazing wormholes. A wormhole is very peculiar because it is a one-way path that delivers you to its destination at a time that is BEFORE you entered the wormhole! Each of…

C++11 標準新特性:Defaulted 和 Deleted 函數

https://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/index.html Defaulted 函數 背景問題 C 的類有四類特殊成員函數&#xff0c;它們分別是&#xff1a;默認構造函數、析構函數、拷貝構造函數以及拷貝賦值運算符。這些類的特殊成員函數負責創建、初始化、…

順序表實現棧相關操作

1.棧的相關概念 棧是一種特殊的線性表, 其中只允許在固定的一端進行插入和刪除元素.進行數據插入和刪除的一端叫做棧頂, 另一端成為棧底. 不含任何元素的棧稱為空棧, 棧又稱為先進先出的線性表. 2. 順序棧的結構 3. 順序棧的具體操作 (1). 數據結構 typedef char SeqStackTyp…

MPI Maelstrom——Dijkstra

【題目描述】 BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distributed shared memory machine with a hierarchical communication subsystem. Valentine McKee’s research advisor, Jack Swigert, has asked her to bench…