1. 程式人生 > 實用技巧 >【GDUT新生賽】部分題目回顧以及學到的一些新知識(自我學習用)

【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)