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 }