codeforces 485A.Factory 解题报告

题目链接:http://codeforces.com/problemset/problem/485/A

题目意思:给出 a 和 m,a 表示第一日的details,要求该日结束时要多生产 a mod m,那么再加上原来的,就总共有 a + a mod m 的details 啦,然后这个数就成了第二日开始的 details ,接着临一天结束要多生产(a + a mod m) mod m,第三日开始就变成 (a + a mod m) +  (a + a mod m) mod m 。不断地重复重复重复.......问这个 mod 出来的值会不会在某一天会 等于0,会就输出“Yes”,否则“No”。

  话说,这条题目做的时候,看不懂意思 = =.........好久没试过连 A 的意思都看不懂了- - ,而且个details 究竟是什么来的 - -  = = ......

最常规最保险的做法就是试遍 1e5 次,用一个 vis 数组来记录 mod 出来的值,假设为 x ,即 vis[x] = 1,当发现又算出 x 的时候(判断是否vis[x]),那么就代表余数循环了,就没有必要继续尝试!

    然后我是非常规做的,凭着女人的直觉,开了个50个循环,过了。不过很不幸的是,不知道是什么原理啦~~~~然后想找到这个确切值,发现是17。就是说,如果 17 次循环,mod 出来的结果都不为 0,就没必要继续往后尝试之后的天数了。知道原理的,望各位大侠指点指点,小女子不胜感激。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     #ifndef ONLINE_JUDGE
10         freopen("input.txt", "r", stdin);
11     #endif
12     int a, m;
13     while (scanf("%d%d", &a, &m) != EOF)
14     {
15         bool flag = true;
16         for (int i = 1; i <= 17; i++)   // 17之后都可以
17         {
18             int mod = a % m;
19             if (mod == 0)
20             {
21                 flag = false;
22                 break;
23             }
24             a = a + mod;
25         }
26         printf("%s\n", flag ? "No" : "Yes");
27     }
28     return 0;
29 }

 

posted @ 2014-11-06 21:13  windysai  阅读(248)  评论(0编辑  收藏  举报