【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版
2016-11-07 19:22
429 查看
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1501
dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐。
时间复杂度\(O(n+m)\)。
dp求出环状不连续的前缀和,剩下东西都可以算出来,比较繁琐。
时间复杂度\(O(n+m)\)。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const int N = 500003; int a , b , n, m, f [3], id ; ll k, win = 0, los = 0; int gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b);} int main() { scanf("%d%d%lld", &n, &m, &k); for (int i = 0; i < n; ++i) scanf("%d", a + i); for (int i = 0; i < m; ++i) scanf("%d", b + i); int ret = 0; if (n > m) { swap(a, b); swap(n, m); ret ^= 1; } int g = gcd(n, m), delta = n, tmp, tot = 0; for (int i = 0; i < g; ++i) for (int j = 0; j < 3; ++j) f[i][j] = (b[i] == j), id[i] = ++tot; tmp = 0; int tms = m / g; for (int i = 1; i < tms; ++i) { tmp = (tmp + delta) % m; for (int j = tmp; j < tmp + g; id[j] = ++tot, ++j) for (int k = 0; k < 3; ++k) f[j][k] = f[(j - delta + m) % m][k] + (b[j] == k); } int pos, beat, lose, end; for (int i = 0; i < n; ++i) { pos = tmp + i % g; beat = (a[i] + 1) % 3; lose = (a[i] - 1 + 3) % 3; win += f[pos][beat]; los += f[pos][lose]; } end = tmp; ll lun = 1ll * n * m / g; win = win * (k / lun); los = los * (k / lun); k = k % lun; for (int i = 0; i < n; ++i) { if (i + 1 <= k) tms = (k - i - 1) / n + 1; else continue; pos = i; tmp = (int) ((1ll * delta * (tms - 1) % m + pos) % m); beat = (a[i] + 1) % 3; lose = (a[i] - 1 + 3) % 3; if ((tmp + delta) % m == pos) { win += f[end + i % g][beat]; los += f[end + i % g][lose]; } else if (pos < g) { win += f[tmp][beat]; los += f[tmp][lose]; } else if (id[pos] <= id[tmp]) { win += f[tmp][beat] - f[(pos - delta + m) % m][beat]; los += f[tmp][lose] - f[(pos - delta + m) % m][lose]; } else { win += f[tmp][beat] + f[end + i % g][beat] - f[(pos - delta + m) % m][beat]; los += f[tmp][lose] + f[end + i % g][lose] - f[(pos - delta + m) % m][lose]; } } if (ret) swap(win, los); printf("%lld %lld\n", win, los); return 0; }
相关文章推荐
- [暴力 乱搞] 51Nod 1501 算法马拉松19 D 石头剪刀布威力加强版
- 【51NOD 1501】【51NOD 算法马拉松19】石头剪刀布威力加强版
- [暴力 乱搞] 51Nod 1616 算法马拉松19 B 最小集合
- 【51nod】算法马拉松19 总结
- 【51NOD 1616】【51NOD 算法马拉松19】最小集合
- [数学] 51Nod 1622 算法马拉松19 C 集合对
- 【51NOD 1622】【51NOD 算法马拉松19】集合对
- 【51nod 算法马拉松19 C】 集合对
- 【51Nod 1616】【算法马拉松 19B】最小集合
- [特征根法 || 高斯消元] 51Nod 1653 算法马拉松19 E 夹克赌坊
- 【51nod 算法马拉松19 A】区间的价值 V2
- 51nod 算法马拉松19 A P1674
- 51nod-算法马拉松19
- [暴力 乱搞] 51Nod 1674 算法马拉松19 A 区间的价值 V2
- 【51NOD 1674】【51NOD 算法马拉松19】区间的价值 V2
- 51nod 算法马拉松30 A.函数【容斥】【组合数学】
- 51nod 算法马拉松3 A:序列分解
- 51nod 算法马拉松32 题解
- 51nod算法马拉松12
- 51Nod 算法马拉松12 Rikka with sequences