ACM_蛋糕小王子鐵頭娃
阿新 • • 發佈:2018-05-20
ret clas class 選擇 重復 技術 pro 輸入數據 std
Problem Description:
鐵頭娃制作了很多蛋糕,想分給他的小夥伴們,他的小夥伴很喜歡鐵頭娃做的蛋糕,每個人都想分到最多蛋糕 鐵頭娃想到了一個頭鐵主意:先給小夥伴們從1到N編號,在1-N區間隨機選擇一個數字K,每個編號取余K等於0的小夥伴會分 到一個蛋糕,重復多次,分蛋糕的過程有時鐵頭娃想皮一下,就會隨機選擇一個編號D的小夥伴,問他分到了多少塊蛋糕。
Input:
輸入數據有多組,每一組第一行包含兩個數字N,M(1 <= N <= 50000 , 1 <= M <= 50000) 接下來M行,每一行包含兩個數, 第一個數輸入1則表示鐵頭娃要分蛋糕,接下來一個數字K,表示所有編號取余K為0的小夥伴分到一個蛋糕。 第一個數如果是2,表示鐵頭娃想皮一下,接下來一個數字D。
Output:
對於每次鐵頭娃的皮,輸出D號小夥伴擁有的蛋糕
Sample Input:
5 5 1 1 1 3 1 4 2 2 2 3
Sample Output:
1 2
解題思路:剛開始做這道題時,不知道怎麽把因子k的倍數的個數依次加1,(菜雞弱,做題少,想不出來QAQ,生硬暴力結果TLE,流下了沒技術的眼淚Orz)。當看到這個題解時恍然大悟,原來可以這麽做。簡單說一下思路:定義一個一維數組,其元素類型是vector容器,用來存放每個數組元素下標的所有因子。再定義一個一維數組用來存放每個因子的個數,當訪問編號D元素分到多少個蛋糕時,只需將D中每個因子的個數加起來即為編號D分到蛋糕的個數。
AC代碼:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn = 50005; 4 vector<int> vec[maxn];//把數組中每一個元素定義為vector容器,存放的是對應下標的所有因子 5 void init(){ 6 vec[1].push_back(1);//1的因子只有1 7 for(int i=2;i<=50000;++i){ 8 vec[i].push_back(1); 9 vec[i].push_back(i);//包括1和它本身的因子先放進容器 10 } 11 for(int i=2;i<=25000;++i)//i是j的因子 12 for(int j=i*2;j<=maxn;j+=i)//i的倍數即為j的因子 13 vec[j].push_back(i); 14 } 15 int n,m,x,y,a[maxn];//數組a記錄每個因子的個數 16 int main() 17 { 18 init();//打表 19 while(cin>>n>>m){ 20 memset(a,0,sizeof(a));//初始化 21 while(m--){ 22 cin>>x>>y; 23 if(x==1)a[y]++;//將y這個因子的個數加1 24 else{ 25 int ans=0; 26 for(unsigned int i=0;i<vec[y].size();++i) 27 ans+=a[vec[y][i]];//將D中每個因子的個數全部加起來 28 cout<<ans<<endl; 29 } 30 } 31 } 32 return 0; 33 }
ACM_蛋糕小王子鐵頭娃