• CF676E:The Last Fight Between Human and AI


    人类和电脑在一个多项式上进行博弈,多项式的最高次项已知,一开始系数都不确定。电脑先开始操作,每次操作可以确定某次项的系数,这个系数可以是任意实数。给出一个博弈中间状态,最后如果这个多项式被x-K整除就算人类赢,问人类是否有可能赢。n<=1e5,K和所有给出的系数的绝对值在1e4内,不确定的系数用?表示。

    这个读入有点坑爹。。。

    要使,做一下除法,余数大概长这个样子

    问题即有没有可能使L为0。

    (一)K=0时,决胜关键就在a0,如果a0确定了并且不为0那就完了,如果a0没确定,看轮到谁,轮到人类赢,轮到电脑输。

    (二)K≠0时

    (1)如果有系数未确定,看最后一步是谁走,如果是人类走,则最后相当于解一个一元一次方程,由于k不为0因此一定有解,如果电脑走则一定输。

    (2)如果系数都确定了,就要检验这个式子是否为0,由于次数太高无法计算,因此取几个模数检验一下模完是否都是0,用秦九韶计算。

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<stdlib.h>
     4 #include<algorithm>
     5 //#include<assert.h>
     6 #include<math.h>
     7 #include<iostream>
     8 using namespace std;
     9 
    10 int n,k;
    11 #define maxn 100011
    12 #define LL long long
    13 const int mod[]={10007,1000007,1000000007,19260817,999911659};
    14 int a[maxn];bool ok[maxn];char s[20];
    15 int main()
    16 {
    17     scanf("%d%d",&n,&k);
    18     int cnt=0;
    19     memset(ok,0,sizeof(ok));
    20     for (int i=0;i<=n;i++)
    21     {
    22         scanf("%s",s);
    23         if (s[0]=='?') cnt++,ok[i]=1;
    24         else
    25         {
    26             int t=1;if (s[0]=='-') t=-1;
    27             int tmp=0;for (int j=(s[0]=='-');j<strlen(s);j++) tmp=tmp*10+s[j]-'0';
    28             a[i]=tmp*t;
    29         }
    30     }
    31     bool ans=0;
    32     if (k==0)
    33     {
    34         if (ok[0])
    35         {
    36             if ((n+1-cnt)&1) ans=1;
    37             else ans=0;
    38         }
    39         else if (a[0]==0) ans=1;else ans=0;
    40     }
    41     else
    42     {
    43         if (cnt)
    44         {
    45             if (n&1) ans=1;
    46             else ans=0;
    47         }
    48         else
    49         {
    50             bool flag=1;
    51             for (int j=0;j<5;j++)
    52             {
    53                 LL ans=0;
    54                 for (int i=n;i>=0;i--)
    55                 {
    56 //                    cout<<ans<<endl;
    57                     ans=(ans*k+a[i])%mod[j];
    58                 }
    59 //                cout<<ans<<endl;
    60                 if (ans) flag=0;
    61             }
    62             if (flag) ans=1;
    63             else ans=0;
    64         }
    65     }
    66     printf(ans?"Yes
    ":"No
    ");
    67     return 0;
    68 }
    View Code
  • 相关阅读:
    蓝桥杯 包子凑数(完全背包、裴蜀定理、赛瓦维斯特定理)
    AcWing 255. 第K小数主席树(可持久化线段树) 模板题
    HDU 1698 Just a Hook [线段树+区间修改为一个值+区间查询]
    POJ 3264 Balanced Lineup
    AcWing 1277. 维护序列
    HDU 3577 Fast Arrangement [线段树+区间修改+维护最大值]
    【学习笔记】权值线段树
    NOIP2017 小凯的疑惑 解题报告(赛瓦维斯特定理)
    k8s (kubenetes)集成runner 清明
    gitlab CIDI 构建环境优化 清明
  • 原文地址:https://www.cnblogs.com/Blue233333/p/7659191.html
Copyright © 2020-2023  润新知