开始水一波博客
A. Choosing Ice Cream
题意就是n个冰淇淋,骰子有k个面,问你是否能在公平的概率下转几次骰子能确定买哪个冰淇淋。
举个例子,假设我只有一个冰淇淋,我不用转骰子直接就会买这个,所以转骰子的次数是0,如果我有4个冰淇淋,2个骰子面,我可以先把冰淇淋abcd分成两部分,ab一组,cd一组,这是等概率的,我先转一次骰子确定是选ab组还是cd组,然后再转一次就可以确定买哪个了。如果我有6个冰淇淋,12个面,我可以每一种冰淇淋贴2个面,转一次就可以确定了。个人理解是这种意思。
这个题读题猜题意猜了好久(捂脸==),题意猜对之后还是没过,最后发现是gcd是变化的,所以每循环一次就要重新算一遍gcd,1的情况特判一下就可以了。
代码:
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<iomanip> 5 #include<stdio.h> 6 #include<math.h> 7 #include<cstdlib> 8 #include<set> 9 #include<map> 10 #include<ctime> 11 #include<stack> 12 #include<queue> 13 #include<vector> 14 #include<set> 15 #define ll long long int 16 #define INF 0x7fffffff 17 #define LIT 0x3f3f3f3f 18 #define mod 1000000007 19 #define me(a,b) memset(a,b,sizeof(a)) 20 #define PI acos(-1.0) 21 #define ios ios::sync_with_stdio(0),cin.tie(0); 22 using namespace std; 23 const int maxn=1e5+5; 24 int main(){ 25 int t,n,k; 26 scanf("%d",&t); 27 while(t--){ 28 scanf("%d%d",&n,&k); 29 if(n==1){ 30 printf("0 "); 31 continue; 32 } 33 int c=__gcd(n,k); 34 if(c==1){ 35 printf("unbounded "); 36 continue; 37 } 38 int ans=0; 39 while(c!=1){ 40 n/=c; 41 c=__gcd(n,k); 42 ans++; 43 } 44 if(n==1) 45 printf("%d ",ans); 46 else 47 printf("unbounded "); 48 } 49 }