hdu1848(sg函数打表)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1848

题意:中文题诶~

思路:直接sg函数打表就好了

代码:

 1 #include <iostream>
 2 #include <string.h>
 3 #define MAXN 3010
 4 using namespace std;
 5 
 6 int f[MAXN], sg[MAXN];
 7 
 8 void init(){//得到1000以内的fibonacci数列
 9     f[1]=1;
10     f[2]=2;
11     for(int i=3; ; i++){
12         f[i]=f[i-1]+f[i-2];
13         if(f[i]>1000){
14             break;
15         }
16     }
17 }
18 
19 void get_sg(){//sg函数打表
20     for(int i=1; i<=1000; i++){
21         int vis[MAXN];
22         memset(vis, 0, sizeof(vis));
23         for(int j=1; f[j]<=i; j++){//找到当前节点能到达的点
24             vis[sg[i-f[j]]]=1;
25         }
26         for(int j=0; j<=1000; j++){//求mex函数
27             if(!vis[j]){
28                 sg[i]=j;
29                 break;
30             }
31         }
32     }
33 }
34 
35 int main(void){
36     init();
37     get_sg();
38     int n, m, p;
39     while(cin >> n >> m >> p){
40         if(n+m+p==0){
41             break;
42         }
43         if(sg[n]^sg[m]^sg[p]){//sg函数性质
44             cout << "Fibo" << endl;
45         }else{
46             cout << "Nacci" << endl;
47         }
48     }
49     return 0;
50 }
View Code
原文地址:https://www.cnblogs.com/geloutingyu/p/6653460.html