PAT (Advanced Level) Practice 1160 Forever
说来惭愧,许久不练题,思考一个问题很久——给定位数和总位数之和,求这样的数字有多少个。忘记了可以用dfs解决。因为这个问题纠结了许久。时间久了连gcd的板子写得都不熟练了
这道题目,如果
n
=
m
+
1
n=m+1
n=m+1的话,是不可能满足题意的,所以
A
A
A的最后一位数字必然是9。其他位就不确定,所以暴力枚举。
#include <bits/stdc++.h>
using namespace std;
#define Pair pair<int, string>
vector<Pair > vec;
int n, k, m, l, res;
bool isPrime(int n){
if(n<=2)
return false;
for(int i=2; i*i<=n; i++){
if(n%i==0)
return false;
}
return true;
}
int gcd(int a, int b){
int r;
while(b){
r=a%b;
a=b;
b=r;
}
return a;
}
void dfs(int sum, int f, string str){
if(!f){
if(!sum && str[0]!='0' && str[k-l-1]!='9'){//高位不能以0开头;除去后面连续的9,str的最后一位也不可以为9,否则加1时最初的sum会发生改变
for(int i=1; i<=l; i++)
str+="9";
Pair p;
p.first=res, p.second=str;
vec.push_back(p);
}
return;
}
for(int i=0; i<=9; i++){
if(sum<i)
break;
string temp=to_string(i);//to_string()将数字常量转换为字符串
dfs(sum-i, f-1, str+temp);
}
}
bool cmp(Pair a, Pair b){
if(a.first != b.first)
return a.first < b.first;
else
return a.second < b.second;
}
int main()
{
cin>>n;
for(int i=1; i<=n; i++){
vec.clear();
cin>>k>>m;
cout<<"Case "<<i<<"\n";
for(int j=1; j<k; j++){
res=m-j*9+1;
if(isPrime(gcd(res, m))){
l=j;
dfs(res-1, k-j, "");
}
}
int size=vec.size();
if(size){
sort(vec.begin(), vec.end(), cmp);
for(int i=0; i<size; i++)
cout<<vec[i].first<<" "<<vec[i].second<<"\n";
} else {
cout<<"No Solution\n";
}
}
return 0;
}