题目链接:https://nanti.jisuanke.com/t/31000

题意:有N堆石子(N为大数),每堆的个数按一定方式生成,问先手取若干堆进行尼姆博弈,必胜的方式有多少种。

题解:因为 k < 4096,所以出现的数最多只有4096个,对每个数字只考虑出现奇/偶次进行dp,答案是所有不等于0的dp值的和。然后如果一个数字出现x次,它对自己出现奇数次的方案数和偶数次的方案数贡献都是乘上2 ^ (x - 1),每个数字的贡献都是2 ^ (x - 1) 总贡献就是2 ^ (N - ∑(vis[i]))。大数可以一边读入一边取模。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 #define ll long long
  4 #define ull unsigned long long
  5 #define mst(a,b) memset((a),(b),sizeof(a))
  6 #define mp(a,b) make_pair(a,b)
  7 #define fi first
  8 #define se second
  9 #define pi acos(-1)
 10 #define pii pair<int,int>
 11 const int INF = 0x3f3f3f3f;
 12 const double eps = 1e-6;
 13 const int MAXN = 1e7 + 10;
 14 const int MAXM = 2e6 + 10;
 15 const ll mod = 1e9 + 7;
 16
 17 bool vis[4105];
 18 int dp[2][8192];
 19 vector<int>vec;
 20 int f[4105];
 21
 22 ll pow_mod(ll a, ll n) {
 23     ll ans = 1;
 24     while(n) {
 25         if(n & 1) ans = ans * a % mod;
 26         a = a * a % mod;
 27         n >>= 1;
 28     }
 29     return ans;
 30 }
 31
 32 int main() {
 33 #ifdef local
 34     freopen("data.txt", "r", stdin);
 35 //    freopen("data.txt", "w", stdout);
 36 #endif
 37     ll ans = 0;
 38     char ch;
 39     int len = 0;
 40     int n = 1e9;
 41     while(1) {
 42         scanf("%c", &ch);
 43         if(ch == ' ') break;
 44         ans = pow_mod(ans, 10);
 45         if(len == 0) ans = 1;
 46         ans = ans * (1ll << (ch - '0')) % mod;
 47         if(len <= 5) {
 48             if(len == 0)
 49                 n = 0;
 50             n = n * 10 + ch - '0';
 51             len++;
 52         }
 53     }
 54     int x;
 55     scanf("%d", &x);
 56     int temp = x;
 57     int a, b, c, d, e, k;
 58     scanf("%d%d%d%d%d%d", &a, &b, &c, &d, &e, &k);
 59     vec.push_back(x);
 60     vis[x] = true;
 61     for(int i = 1; i <= 4100; i++) {
 62         int x1 = 1ll * a * i * i % k * i * i % k;
 63         int x2 = 1ll * b * i * i % k * i % k;
 64         int x3 = 1ll * c * i * i % k;
 65         int x4 = 1ll * d * i;
 66         x = (x1 + x2 + x3 + x4 + e - 1) % k + 1;
 67         f[i] = x;
 68     }
 69     int all = 0;
 70     while(all < n) {
 71         all++;
 72         int now = f[temp];
 73         if(!vis[now]) {
 74             vis[now] = true;
 75             vec.push_back(now);
 76             temp = now;
 77         } else break;
 78     }
 79     int sz = vec.size();
 80     dp[0][0] = 1;
 81     int pre = 1, now = 0;
 82     for(int i = 1; i <= sz; i++) {
 83         swap(pre, now);
 84         int num = vec[i - 1];
 85         for(int j = 0; j < 8192; j++) dp[now][j] = dp[pre][j];
 86         for(int j = 0; j < 8192; j++) {
 87             dp[now][j ^ num] += dp[pre][j];
 88             if(dp[now][j ^ num] >= mod) dp[now][j ^ num] -= mod;
 89         }
 90     }
 91     ll sum = 0;
 92     for(int i = 1; i < 8192; i++) {
 93         sum += dp[now][i];
 94         if(sum >= mod) sum -= mod;
 95     }
 96     ll inv = pow_mod(2, sz);
 97     inv = pow_mod(inv, mod - 2);
 98     ans = ans * inv % mod;
 99     ans = ans * sum % mod;
100     printf("%lld\n", ans);
101     return 0;
102 }

转载于:https://www.cnblogs.com/scaulok/p/9573791.html

ACM-ICPC 2018 南京赛区网络预赛 K. The Great Nim Game(博弈)相关推荐

  1. ACM-ICPC 2018 南京赛区网络预赛

    轻轻松松也能拿到区域赛名额,CCPC真的好难 An Olympian Math Problem 问答 只看题面 54.76% 1000ms 65536K Alice, a student of gra ...

  2. ACM-ICPC 2018 南京赛区网络预赛 B. The writing on the wall

    题目链接:https://nanti.jisuanke.com/t/30991 2000ms 262144K Feeling hungry, a cute hamster decides to ord ...

  3. ACM-ICPC 2018 南京赛区网络预赛 AC Challenge

    Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he knows the answe ...

  4. ACM-ICPC 2018 南京赛区网络预赛 E AC Challenge(状压dp)

    Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he knows the answe ...

  5. ACM-ICPC 2018 南京赛区网络预赛 Lpl and Energy-saving Lamps 线段树

    目录 ACM-ICPC 2018 南京赛区网络预赛 Lpl and Energy-saving Lamps 线段树 题面 题意 思路 ACM-ICPC 2018 南京赛区网络预赛 Lpl and En ...

  6. ACM-ICPC 2018 南京赛区网络预赛 - AC Challenge(状压DP)

    ACM-ICPC 2018 南京赛区网络预赛 - AC Challenge 题意: 有n个题目,每个题目有一些信息,,第 t 个过第 i 题会得到分数 t*ai + bi 在过第 i 题前必须要先过  ...

  7. E. AC Challenge ACM-ICPC 2018 南京赛区网络预赛 状压dp + 枚举状态

    博客目录 原题 题目链接 Dlsj is competing in a contest with n (0 < n \le 20)n(0<n≤20) problems. And he kn ...

  8. ACM-ICPC 2018 南京赛区网络预赛(ABCDEFGHIJKL所有题题解大全)

    新高一蒟蒻队的第一次ACM-- 赛场上和队友时间安排不太恰当--只过了9题,第10题差半个小时2333--/还是自己太弱了 赛后经过一段时间把所有题全部A掉了2333-- A:题目链接 这道题在聊天中 ...

  9. ACM-ICPC 2018 南京赛区网络预赛 L. Magical Girl Haze 最短路+分层图

    类似题解 There are NN cities in the country, and MM directional roads from uu to v(1\le u, v\le n)v(1≤u, ...

最新文章

  1. java 唯一值_java – 在列表中查找唯一值的快速方法
  2. E.Text Editor (Gym 101466E + 二分 + kmp)
  3. Castle.ActiveRecord的嵌套事务处理
  4. python文件编码与解码_Python读取文件编码解码问题
  5. spring的aop注解配置(了解)
  6. Serverless——前端的3.0时代
  7. window.onload,body onload=function(), document.onreadystatechange, httpRequest.onreadystatechang
  8. 最短路dijkstra算法详解_最短路径问题---Dijkstra算法详解
  9. shell 获取值 默认值
  10. ionic cordova 引用百度地图以及利用手机GPS定位
  11. PyCharm取消启动时自动加载项目
  12. 基于MVC的jpetstore项目分析
  13. Qt——P26 Label控件显示图片
  14. Facebook开发地面技术扩大互联网连接
  15. 在MATLAB中快速画圆(给出圆心坐标和半径就能直接画的那种)
  16. C++ Primer 第5版--练习8.5
  17. 快速上手Android蓝牙串口开发
  18. webstorm下载安装过程打开项目
  19. 大数据学习之一——Hadoop单机部署
  20. 实现表格隔行变色的方法

热门文章

  1. android studio大作业-简易计算器实现
  2. ESIM模型的“全能版”!网易易盾实验室研究员解读HIM混合推理模型
  3. 全民一起玩Python提高篇第十二课:面向对象基本原理与语法(三)
  4. 5G NR 网络切片是什么意思
  5. 未来计算机畅想英语作文,畅想未来的生活life in the future
  6. 命题逻辑完备性定理证明
  7. 八爪鱼爬取列表数据和详情页数据(国内网址)
  8. 【Faster R-CNN论文精度系列】从Faster R-CNN源码中,我们“学习”到了什么?
  9. 小米最大的竞争对手不是苹果而是华为
  10. 非常道:ChatGPT 与思想革命