【算法题】博弈+大数乘法+高精度

博弈论(巴什博奕,威佐夫博弈,尼姆博弈,斐波那契博弈)【总结得很齐全】

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;
}

猜你喜欢

转载自blog.csdn.net/yifen4234/article/details/80280441