牛客Wannafly挑战赛23 B.游戏

本文介绍了一个基于石子堆的游戏博弈问题,玩家需遵循特定规则移除石子以获得胜利。文章提供了一段C++代码实现,通过预处理SG值并枚举每堆石子的约数来计算先手玩家的第一步必胜策略数量。

游戏

题目描述

小N和小O在玩游戏。他们面前放了n堆石子,第i堆石子一开始有c i颗石头。他们轮流从某堆石子中取石子,不能不取。最后无法操作的人就输了这个游戏。但他们觉得这样玩太无聊了,更新了一下规则。具体是这样的:对于一堆有恰好m颗石子的石头堆,假如一个人要从这堆石子中取石子,设他要取石子数为d,那么d必须是m的约数。最后还是无法操作者输。
现在小N先手。他想知道他第一步有多少种不同的必胜策略。一个策略指的是,从哪堆石子中,取走多少颗石子。只要取的那一堆不同,或取的数目不同,都算不同的策略。

输入描述:

第一行一个整数n。
接下来一行n个整数,分别代表每堆石子的石子数目。
数据保证输入的所有数字都不超过10^5,均大于等于1,且为整数。

输出描述:

一行一个整数代表小N第一步必胜策略的数量。

输入

10
47 18 9 36 10 1 13 19 29 1

输出

7
链接:https://www.nowcoder.com/acm/contest/161/B
来源:牛客网
预处理下SG值,然后枚举下每堆拿走约数。
 1 #include<cstdio>
 2 #include<cstring>
 3 using namespace std;
 4 const int maxn = 100005;
 5 int sg[maxn];
 6 int a[maxn];
 7 bool vis[maxn];
 8 
 9 void getSg()
10 {
11 
12     sg[0]=0;
13     for(int i=1;i<maxn;i++)
14     {
15         memset(vis,0,sizeof(vis));
16 
17         for(int j=1;j*j<=i;j++)
18         {
19             if(i%j==0)
20             {
21                 vis[sg[i-j]]=1;
22                 vis[sg[i-i/j]]=1;
23             }
24         }
25 
26         for(int j=0;j<maxn;j++)
27         {
28             if(vis[j]==0)
29             {
30                 sg[i]=j;
31                 break;
32             }
33         }
34     }
35 }
36 
37 int main()
38 {
39     getSg();
40     int n;
41     scanf("%d",&n);
42     int sum = 0;
43     for(int i=1;i<=n;i++)
44     {
45         scanf("%d",&a[i]);
46         sum ^= sg[a[i]];
47     }
48     int ans = 0;
49     for (int i = 1; i <= n; ++i)
50     {
51         sum ^= sg[a[i]];
52         for (int j = 1; j * j <= a[i]; ++j)
53         {
54             if (a[i] % j == 0)
55             {
56                 if (!(sg[a[i] - j] ^ sum))
57                     ans++;
58                 if (j * j != a[i] && !(sg[a[i] - a[i] / j] ^ sum))
59                     ans++;
60             }
61         }
62         sum ^= sg[a[i]];
63     }
64     printf("%d\n",ans);
65     return 0;
66 }
View Code

 

转载于:https://www.cnblogs.com/xcantaloupe/p/9571995.html

在车辆工程中,悬架系统的性能评估和优化一直是研究的热点。悬架不仅关乎车辆的乘坐舒适性,还直接影响到车辆的操控性和稳定性。为了深入理解悬架的动态行为,研究人员经常使用“二自由度悬架模型”来简化分析,并运用“传递函数”这一数学工具来描述悬架系统的动态特性。 二自由度悬架模型将复杂的车辆系统简化为两个独立的部分:车轮和车身。这种简化模型能够较准确地模拟出车辆在垂直方向上的运动行为,同时忽略了侧向和纵向的动态影响,这使得工程师能够更加专注于分析与优化与垂直动态相关的性能指标。 传递函数作为控制系统理论中的一种工具,能够描述系统输入和输出之间的关系。在悬架系统中,传递函数特别重要,因为它能够反映出路面不平度如何被悬架系统转化为车内乘员感受到的振动。通过传递函数,我们可以得到一个频率域上的表达式,从中分析出悬架系统的关键动态特性,如系统的振幅衰减特性和共振频率等。 在实际应用中,工程师通过使用MATLAB这类数学软件,建立双质量悬架的数学模型。模型中的参数包括车轮质量、车身质量、弹簧刚度以及阻尼系数等。通过编程求解,工程师可以得到悬架系统的传递函数,并据此绘制出传递函数曲线。这为评估悬架性能提供了一个直观的工具,使工程师能够了解悬架在不同频率激励下的响应情况。
### 关于牛客网练习赛14 B题的解析 目前未找到直接针对牛客网练习赛14 B题的具体题解或比赛经验。然而,可以通过分析类似的题目以及常见的算法竞赛技巧来推测可能的解决方案。 #### 类似问题的解决思路 在算法竞赛中,B类题目通常涉及基础数据结构的应用或者简单的数学推导。以下是几种常见类型的处理方式: 1. **字符串操作** 若该题涉及到字符串处理,则可以利用C++中的`std::string`库函数[^2],例如查找子串、替换字符等操作。 2. **数组与序列** 对于数组或序列的操作,动态规划(Dynamic Programming, DP)是一种常用方法。通过定义状态转移方程,逐步解决问题。例如,在某些情况下,可以用滚动数组优化空间复杂度[^3]。 3. **图论模型** 如果题目描述中有提到节点之间的关系,可能是图论问题。此时可采用广度优先搜索(BFS)、深度优先搜索(DFS),甚至最短路径算法如Dijkstra或Floyd-Warshall来建模并求解[^1]。 4. **模拟与暴力枚举** 当面对简单逻辑判断或多步运算时,“模拟”成为一种有效手段。即按照题目给定规则一步步实现程序流程,虽然时间效率未必最优,但对于小规模输入非常适用[^5]。 下面提供一段伪代码框架供参考: ```cpp #include <iostream> using namespace std; int main(){ int testCase; cin >> testCase; while(testCase--){ // 输入处理... // 解决方案核心部分 // 输出结果 } } ``` #### 提升竞赛表现的经验分享 为了更好地准备此类赛事,建议采取以下策略: - 定期参与线上平台举办的各类比赛积累实战经历; - 复盘每次赛后官方发布的详解文档学习新知; - 加强基础知识巩固的同时拓宽思维边界尝试不同领域挑战项目; ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值