C - Win or Freeze
这个题是一个博弈的题目,因为我们要确定这次选的数是否能分出来两个质数,如果可以我们就赢了。
我们可以判断一下n的质因数的个数,如果这个数量大于等于2,则1会赢。如果只有一个质因数,我们就输了。
至于为什么当质因数的数量大于等于2的时候1就赢了,因为这个时候1总能构造出一个数为两个质因数乘积,这样2就只能给1质数,1就赢了。
或者没有质因数我们也会赢
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int slove(long long n){
if(n==1)
return 0;
long long xx=n;
int temp=1;
int cnt=0;
for(int i =2;i<=sqrt(n);i++){
while(xx%i==0){
++cnt;
if(cnt<=2){
temp*=i;
xx/=i;
}else{
return temp;
}
}
}
if(xx>1)
cnt++;
if(cnt==1)
return 0;
else if(cnt==2)
return -1;
else
return temp;
}
long long x;
int main(){
cin>>x;
int ans=slove(x);
if(ans==-1)
cout<<"2"<<endl;
else
cout<<"1"<<"\n"<<ans<<endl;
return 0;
}
D - Quantity of Strings
这个题目是一个找规律的题目,n,m,k。
求一个长度的n的字符串中最多包含m个字符种类的连续子串必须为长度为k的回文。
当k==1的时候,有m^n种可能性。因为每个点的字符串都可以不一样。
当n<k的时候同上,但是我感觉这种情况不存在。
如果n==k的时候,若k为偶数,则可能性为m(n/2),因为左右需要相等。若k为奇数,则可能出现的数量为m(n/2+1)。
若n>k的时候,若k为偶数,则可能的数量为m个,如果k为奇数则可能的数量为2*m个。
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int mod = 1e9+7;
int main(){
int n,m,k;
cin>>n>>m>>k;
if(k==1||n<k){
long long res=1;
for(int i =0;i<n;i++){
res = res * m;
res = res % mod;
}
cout<<res<<endl;
return 0;
}
if(k%2==0){
if(n==k){
long long res=1;
for(int i =0;i<n/2;i++){
res = res * m;
res = res % mod;
}
cout<<res<<endl;
}else{
cout<<m<<endl;
}
}else{
if(n==k){
long long res=1;
for(int i =0;i<n/2+1;i++){
res = res * m;
res = res % mod;
}
cout<<res<<endl;
}else{
cout<<m*m<<endl;
}
}
return 0;
}