牛客練習賽33
阿新 • • 發佈:2018-12-08
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。示例1
a表示怪物種類數,b表示時間點的個數。
輸入
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 }