【GDUT新生赛】部分题目回顾以及学到的一些新知识(自我学习用)

知识点1:博弈论
https://ac.nowcoder.com/acm/contest/9692/C

#include <bits/stdc++.h>
using namespace std;
char a[5][10]={"Cow","Pig","Cow","Pig","Pig"};
int main(){
    int t; cin>>t;
    while(t--){
        int n; cin>>n;
        n%=5;
        cout<<a[n]<<endl;
    }
    return 0;
}

这题我是直接找的规律,官方题解给出的是“若能开出第k枪,必定能开出第k+5枪”,而事实上也是5轮一循环
但我还是搞不懂原理是啥。后来群友指导是可以用SG函数。参考了部分文献后有点启发,但是不敢说很懂,日后来填坑。

————————————————————————————————————————————————————————————————————————————————————————————————

知识点2:数学(两题)
https://ac.nowcoder.com/acm/contest/9692/D

#include <bits/stdc++.h>
using namespace std;
int solve(int x,int p){
    int ans=0;
    while(x>=p){
        ans+=(x/p);
        x/=p;
    }
    return ans;
}
int main(){
    ios::sync_with_stdio(false),cin.tie(0);
    int t; cin>>t;
    while(t--){
        int n,p; cin>>n>>p;
        cout<<solve(n,p)<<endl;
    }
    return 0;
}

这里涉及到数学知识。首先我们要知道如果q进制转换为p进制的做法是除p取余法
因此题目等价与求n的p因子个数
有点无法理解的话就模拟一下十进制转换二进制的过程

https://ac.nowcoder.com/acm/contest/9692/E
这题是一道思维题,其实和求gcd没啥关系的,注意到k是gcd(i,j)的因数,那么i,j也一定能整除k
因此我们直接找n,m的k的倍数有几个,然后相乘就行了。
答案是就是(n/k)(mk)
(代码都懒得贴了hhhhhhh)

posted @ 2020-12-08 16:05  Time_Limit_Exceeded  阅读(92)  评论(0编辑  收藏  举报