UVa 10726 - Coco Monkey (数学 + 模拟)
2015-04-29 12:56
555 查看
题意
一开始有C个椰子,M个猴子,S个人。第一个人把椰子分成S份,正好剩下M个,给了猴子,自己拿了一份。
第二个人把剩下的椰子分成S份,正好剩下M个,给了猴子,自己拿了一份。
以此类推。
然后第二天的时候,剩下的椰子正好分成S份,没猴子的了。
现在给出一开始的椰子范围[L, R],求一开始的椰子数有几种可能。
思路
肯定不能枚举范围然后模拟。所以就从后往前推。
因为最后可以平分给S个人,所以最后剩下的椰子数remain = k*s。
那么能否根据这个椰子数推出最后一个人拿椰子时候的椰子数呢?
我们设最后一个人拿椰子的时候,每份有x个。
那么sx+m−(x−m)=remain,x=s∗remains−1+m
同理,可以计算出倒数第二个人拿椰子的时候的数目。我们可以一直递推到第一个人的时候的数目,也就是原始的数目,看在不在范围里。
注意每次判断当前的remain能否整除(s-1)。
其实上面那个式子可以转化为等比数列,O(1)计算。不过我推出来感觉怪怪的。
代码
#include <stack> #include <cstdio> #include <list> #include <cassert> #include <set> #include <fstream> #include <iostream> #include <string> #include <vector> #include <queue> #include <functional> #include <cstring> #include <algorithm> #include <cctype> #include <string> #include <map> #include <cmath> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/hash_policy.hpp> using namespace std; #define LL long long #define ULL unsigned long long #define SZ(x) (int)x.size() #define Lowbit(x) ((x) & (-x)) #define MP(a, b) make_pair(a, b) #define MS(arr, num) memset(arr, num, sizeof(arr)) #define PB push_back #define X first #define Y second #define ROP freopen("input.txt", "r", stdin); #define MID(a, b) (a + ((b - a) >> 1)) #define LC rt << 1, l, mid #define RC rt << 1|1, mid + 1, r #define LRT rt << 1 #define RRT rt << 1|1 #define FOR(i, a, b) for ((i)=(a); (i) < (b); (i)++) const double PI = acos(-1.0); const int INF = 0x3f3f3f3f; const double eps = 1e-8; const int MAXN = 300+10; const int MOD = 1e9; const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; const int seed = 131; int cases = 0; typedef pair<int, int> pii; LL s, m, l, r, T; void Solve() { bool flag = false; int ans = 0, j; for (int i = 1; ; i++) { if (flag) break; LL remain = s*i; if (remain % (s-1)) continue; for (j = 0; j < s; j++) { remain = s*remain/(s-1) + m; if (remain > r) { flag = true; break; } if (remain % (s-1) && j != s-1) break; } if (j == s && remain >= l && remain <= r) ans++; } printf("Case %d: %d\n", ++cases, ans); } int main() { //ROP; cin >> T; while (T--) { cin >> s >> m >> l >> r; Solve(); } return 0; }
相关文章推荐
- uva 10726 Coco Monkey(数论)
- uva 10726 - Coco Monkey(数论)
- UVa 3882 And Then There Was One(stl+有技巧的模拟||数学方法+约瑟夫问题)
- UVA-10726 Coco Monkey(递推)
- UVA 679 Dropping Balls 【模拟+数学规律】
- Uva 1319 - Maximum 解题报告(数学)
- Uva 11300 分金币(数学推导和中位数)
- 蓝桥杯 算法训练 麦森数 By Assassin (数学+模拟)
- UVaLive 7362 Farey (数学,欧拉函数)
- uva1594-Ducci-模拟
- UVA 10499 (暑假-数学 -H - The Land of Justice)
- uva 10790 How Many Points of Intersection?(数学)
- 赣南师范学院数学竞赛培训第05套模拟试卷参考解答
- 紫书章四 Spreadsheet Tracking UVA - 512(单元格去哪了,模拟结果更简单))
- uva 10177(数学)
- XMU-1349-数学+模拟
- UVA - 489 Hangman Judge :模拟···WA了N次
- UVA 1590 IP Networks 简单模拟
- uva 10010(数学)
- UVA-10791 数学