【GDUT新生赛】部分题目回顾以及学到的一些新知识(自我学习用)
#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)