<模板>计算SG函数-(hdu 1848 Fibonacci again and again)
来源:互联网 发布:linux sleep 单位 编辑:程序博客网 时间:2024/06/15 23:26
题目传送门
Solution
关于什么是SG函数和SG定理
和普通的Nim游戏不同的是,Nim可以选任意的石子拿走,因此Nim游戏中每一堆石子的SG函数为这一堆中石子的数量
而这道题并不能任意拿,只能按斐波那契数列的个数取,所有此时SG函数的值需要从所有子集取mex操作得到。
计算SG函数的模板如下
f[0]=1;f[1]=1; for(int i=2;i<=20;++i) f[i]=f[i-1]+f[i-2]; sg[0]=0;s[0]=1; for(int i=1;i<=M;++i){ memset(s,0,sizeof(s)); for(int j=0;j<=20&&f[j]<=i;++j) s[sg[i-f[j]]]=1;//判断是否出现 for(int j=0;j<=M;++j) if(!s[j]){ sg[i]=j;//mex操作 break; } }
Code
// by spli#include<cstring>#include<cstdio>#include<algorithm>#include<iostream>using namespace std;const int M=1010;int n,m,p;int f[100];int sg[M],s[M];void pre(){ f[0]=1;f[1]=1; for(int i=2;i<=20;++i) f[i]=f[i-1]+f[i-2]; sg[0]=0;s[0]=1; for(int i=1;i<=M;++i){ memset(s,0,sizeof(s)); for(int j=0;j<=20&&f[j]<=i;++j) s[sg[i-f[j]]]=1; for(int j=0;j<=M;++j) if(!s[j]){ sg[i]=j; break; } }}int main(){ pre(); while(scanf("%d%d%d",&n,&m,&p)&&(n+m+p)){ if(sg[n]^sg[m]^sg[p]) puts("Fibo"); else puts("Nacci"); } return 0;}
阅读全文
0 0
- HDU 1848 Fibonacci again and again (SG函数 模板)
- <模板>计算SG函数-(hdu 1848 Fibonacci again and again)
- HDU 1848 Fibonacci again and again(SG函数)
- HDU 1848Fibonacci again and again(博弈论:sg函数)
- hdu 1848 Fibonacci again and again(SG函数)
- hdu 1848 Fibonacci again and again(sg函数的简单应用 模板题 )
- hdu1848 Fibonacci again and again (博弈论sg函数模板)
- hdu 1848 Fibonacci again and again(SG)
- HDU 1848 Fibonacci again and again【博弈:SG函数】
- HDU 1848 Fibonacci again and again 博弈论SG函数
- HDU 1848 Fibonacci again and again SG函数详解!
- HDU 1848 Fibonacci again and again sg函数
- 【HDU 1848 Fibonacci again and again】 + sg函数
- HDU 1848 Fibonacci again and again(博弈sg函数)
- HDU 1848 Fibonacci again and again (博弈,SG函数)
- hdu 1848 Fibonacci again and again (sg函数)
- HDU 1848 Fibonacci again and again 博弈论-SG函数
- HDU 1848 - Fibonacci again and again(SG)
- 面试易错题整理(一)
- MD5工具类封装
- MFC List Control 控件添加单元格编辑和单元格下拉列表项
- 自定义view四个构造函数代表什么
- C++动态规划算法之数字金字塔【USACO TRAINING】:一道经典的数塔问题
- <模板>计算SG函数-(hdu 1848 Fibonacci again and again)
- HDU 1402 A * B Problem Plus (FFT求高精度乘法)
- mark标记输入流中的当前位置,以便使用reset方法复制到该标记的位置 reset将当前位置复位为上次调用mark方法标记的位置
- 169.Majority Element
- 【Linux】ubuntu首次给root用户设置密码
- [RK3288][Android6.0] 调试笔记 --- ComponentName的使用
- zzuli2174
- android 关于封装tabbar,任意修改样式
- 购物车AngularJs