Problem : 320 - 手機特賣會
Problem:
為了慶祝 iPhone 5S 手機的上市,蓮霧公司在他們的最大直營店擺設了 n 台最新的 iPhone 5S 手機環繞整家直營店,希望在首賣日帶動買氣。殊不知,在首賣日前一天晚上,有 m 個競爭對手的死忠支持者因為不滿銷售量被 iPhone 系列的推出大受打擊,趁夜闖入蓮霧直營店,打算惡搞這些已經開機好正在展示動畫的 iPhone 。
但闖入後才發現,該店展示的 iPhone 數量實在太多,他們沒有時間去惡搞所有的iPhone,他們決定每人只挑部分手機下手:第 i 個人把第 ki, 2ki, 3ki, ... 隻手機倒置;如果手機是開機狀態就把它關機、如果手機是正放就把它倒放,反之亦然。
假設原本所有的 iPhone 全部都是正放且開機,請寫一隻程式去計算這些闖入者在結束他們的惡作劇後,究竟有幾台手機看起來是被惡搞過(過程不重要,只須以最後的狀態判斷即可)。
但闖入後才發現,該店展示的 iPhone 數量實在太多,他們沒有時間去惡搞所有的iPhone,他們決定每人只挑部分手機下手:第 i 個人把第 ki, 2ki, 3ki, ... 隻手機倒置;如果手機是開機狀態就把它關機、如果手機是正放就把它倒放,反之亦然。
假設原本所有的 iPhone 全部都是正放且開機,請寫一隻程式去計算這些闖入者在結束他們的惡作劇後,究竟有幾台手機看起來是被惡搞過(過程不重要,只須以最後的狀態判斷即可)。
Input:
第一行有兩個整數,n 和 m,並以空白分隔。n 代表 iPhone 的總數,而 m 代表有幾個入侵者。接下來是 m 行,每行一個數字,依序代表每個人惡作劇手機的間隔,即 k1, k2, k3, ... , km。
限制:
保證有30%的測試資料滿足:
1 ≤ n ≤ 200
1 ≤ m ≤ 200
1 ≤ ki ≤ n
保證所有的測試資料滿足:
1 ≤ n ≤ 300000
1 ≤ m ≤ 2000000
1 ≤ ki ≤ n
限制:
保證有30%的測試資料滿足:
1 ≤ n ≤ 200
1 ≤ m ≤ 200
1 ≤ ki ≤ n
保證所有的測試資料滿足:
1 ≤ n ≤ 300000
1 ≤ m ≤ 2000000
1 ≤ ki ≤ n
Output:
第一行輸出一整數,代表最後看起來被惡搞過的手機數量x。接下來輸出x行,每行按照由小到大的順序輸出被惡搞的手機編號。
Sample Input:
Sample #1:
7 2
2
3
Sample #2:
5 3
1
2
3
7 2
2
3
Sample #2:
5 3
1
2
3
Sample Output:
Sample #1:
3
2
3
4
Sample #2:
2
1
5
3
2
3
4
Sample #2:
2
1
5
-------------------------------------------------------------------------------------------------------
#include<stdio.h>
int s[300005]={0},add[300005]={0};
int main(){
int i,j,n,m,k,ans=0;
scanf("%d%d",&n,&m);
while(m--){
scanf("%d",&k);
add[k]++;
}
for(i=1;i<=n;i++){
if(add[i]%2){
for(j=i;j<=n;j+=i){
s[j]=1-s[j];
}
}
}
for(i=1;i<=n;i++)
if(s[i])
ans++;
printf("%d\n",ans);
for(i=1;i<=n;i++)
if(s[i])
printf("%d\n",i);
}
沒有留言:
張貼留言