计蒜客 28201.Choosing Ice Cream-gcd (BAPC 2014 Preliminary ACM-ICPC Asia Training League 暑假第一阶段第一场 A)

开始水一波博客

题目链接:

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 }
原文地址:https://www.cnblogs.com/ZERO-/p/9279800.html