1. 程式人生 > >牛客練習賽33

牛客練習賽33

A.tokitsukaze and Counting

題目描述

給出3個整數L,R,x。tokitsukaze想知道,閉區間[L,R]中,x的倍數出現了幾次。

輸入描述:

第一行包括一個正整數T(T<=1000),表示T組資料。
接下來T行,每行包括3個正整數L,R,x。
1≤L≤R≤10^18
1≤x≤10^18

輸出描述:

輸出T行,每一行一個整數,表示答案。
示例1

輸入

1
2 5 3

輸出

1
解題思路:水!
AC程式碼:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 LL T,L,R,x;
 5 int main(){
 6     while(cin>>T){
 7         while(T--){
 8             cin>>L>>R>>x;
 9             cout<<R/x-(L-1)/x<<endl;
10 } 11 } 12 return 0; 13 }

B.tokitsukaze and RPG

題目描述

tokitsukaze最近沉迷一款RPG。
這個RPG一天有k分鐘,每一天從第1分鐘開始。
有n種怪物,第i種怪物每天第一次出現的時間為Xi分鐘,第二次出現的時間為2*Xi分鐘,第三次出現的時間為3*Xi分鐘......同一時刻出現的怪物種類越多,打怪獲得的經驗也越高。
為了高效練級,tokitsukaze想知道在一天內出現怪物種類最多的時間點會出現多少種怪物,這樣的時間點有多少個。

輸入描述:

第一行包括2個正整數n,k(1≤n≤10^5,1≤k≤10^6),表示有n種怪物,一天有k分鐘。
接下來一行包括n個正整數X(1≤Xi≤10^6),含義如題面所示。

輸出描述:

輸出一行,包括兩個整數a,b。
a表示怪物種類數,b表示時間點的個數。
示例1

輸入

3 6
2 2 3

輸出

3 1

說明

在第6分鐘時,3種怪物都出現了。
示例2

輸入

3 5
2 2 3

輸出

2 2

說明

在第2分鐘和第4分鐘時,第一種和第二種怪物出現了。
示例3

輸入

6 10
1 2 3 4 5 6

輸出

4 1

說明

在第6分鐘時,出現了第一種、第二種、第三種、第六種怪物。
示例4

輸入

3 5
6 6 6

輸出

0 5

說明

在第1分鐘、第2分鐘、第3分鐘、第4分鐘、第5分鐘,都沒有出現怪物。
解題思路:埃氏篩nlogn暴力過。
AC程式碼:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int maxn=1e6+5;
 5 int n,k,x,maxxx,cnt[maxn],ans1[maxn],ans2[maxn];
 6 int main(){
 7     while(~scanf("%d%d",&n,&k)){
 8         memset(cnt,0,sizeof(cnt));
 9         memset(ans1,0,sizeof(ans1));
10         memset(ans2,0,sizeof(ans2));maxxx=0;
11         for(int i=0;i<n;++i)scanf("%d",&x),cnt[x]++;
12         for(int i=1;i<=k;++i){
13             if(!cnt[i])continue;
14             for(int j=i;j<=k;j+=i)
15                 ans1[j]+=cnt[i];///統計每個時間點的怪物種類數
16         }
17         for(int i=1;i<=k;++i)maxxx=max(maxxx,ans1[i]),ans2[ans1[i]]++;///最大種類數出現的時間點個數
18         printf("%d %d\n",maxxx,ans2[maxxx]);
19     }
20     return 0;
21 }