博弈论(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈)【总结得很齐全】
https://blog.csdn.net/ac_gibson/article/details/41624623
URAL 1180 Stone Game 【博弈 找规律 大数取模 除3取模】
https://blog.csdn.net/wukuaiyang/article/details/52071301
两人依次从一堆石子中取2的幂次个数的石子,如1 2 4 8 16…,能取到最后一颗石子的获胜。输入n,若第一人获胜则输出1和他第一次至少取多少个石子,若第二人获胜输出2。(n很大,10的250次幂)
博弈题没有思路的时候就先找规律,足够敏感:取模,2的幂次,斐波那契【斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列、费波那西数列、费波拿契数、费氏数列,指的是这样一个数列:1、1、2、3、5、8、13、21、……在数学上,斐波那契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=Fn-1+Fn-2 第47个斐波那契数,int就会保存不下。自己可以把斐波那契数列打印出来看一下。(n>=2,n∈N*),用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。】等等!纸上演算或者写个程序跑打表观察!
char s[300];
intsum=0;
scanf("%s",s);
for(int i=0; i<strlen(s); i++) //注意输入格式
sum+=(s[i]-'0');
if(sum%3==0) printf("2\n");
elseif (sum%3==1) printf("1\n1\n");
elseprintf("1\n2\n");
return 0;
51nod 1185 威佐夫游戏 V2 【博弈+高精度+大数乘法模拟】
https://blog.csdn.net/liangzhaoyang1/article/details/72594221
如果数据在10^6左右,可以直接用。但是这道题数据是10^18【大数,要根据情况不同算法】,那么直接乘的话,肯定会有精度问题。直接大数乘法手动模拟。为了提高精度,我们将0.618033988749894848204586834拆成三部分的整数放进数组里,然后手动模拟乘法。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//0.618033988749894848204586834... 拆成整数放进数组里,
//拆成三部分即可
ll tmp[3] = {618033988,749894848,204586834};
ll MOD = 1e9;
int main()
{
int t;
scanf("%d",&t);
while(t --)
{
ll a,b;
scanf("%lld%lld",&a,&b);
if(a > b)
{
ll t = a;
a = b;
b = t;
}
ll diff = b - a;
//把10^18分成两部分10^9
ll ta = diff / MOD;
ll tb = diff % MOD;
ll tp = tb * tmp[2];
tp = ta * tmp[2] + tb * tmp[1] + tp / MOD;
tp = ta * tmp[1] + tb * tmp[0] + tp / MOD;
tp = ta * tmp[0] + tp / MOD + diff;
if(tp == a)
printf("B\n");
else
printf("A\n");
}
return 0;
}