1. 程式人生 > >ACM_蛋糕小王子鐵頭娃

ACM_蛋糕小王子鐵頭娃

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_蛋糕小王子鐵頭娃