0
已解决
汪恺恒
中级启示者
中级启示者
题目描述 Description
酷町猫很讨厌去邻居家做客,他在偷偷玩一个数字游戏来打发时间。
他首先拿出几张纸,上面写上0~9中的某些数字(可以重复)。然后他让邻居家的小朋友随便写两个数字x和k。酷町猫要拼凑这几张纸,组成数字t,使得t+x是k的正整数倍数。
当纸很多时,酷町猫可能找不到答案。但是他很想知道答案,请你帮他算一下。
输入描述 Input Description
第一行,两个整数,n和m,分别表示纸的数量和询问的数量
第二行,n个整数,每个数字可以取0~9
接下来m行, 每行两个整数,x和k,表示要计算的一组数据
t的首位不能为0。
输出描述 Output Description
对于每组数据,输出符合条件的t,如果有多个,输出符合条件最小的t;
如果没有,输出“None”
WA40
#include<bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
long long n,m,a[15],b[362885],s=1;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
s*=i;
}
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=s;i++){
if(a[1]==0){
b[i]=0x3f3f3f3f;
next_permutation(a+1,a+1+n);
continue;
}
int sum=0;
for(int i=1;i<=n;i++){
sum=sum*10+a[i];
}
b[i]=sum;
next_permutation(a+1,a+1+n);
}
while(m--){
int k,x,f=0;
cin>>x>>k;
for(int i=1;i<=s;i++){
if((b[i]+x)%k==0){
cout<<b[i]<<endl;
f=1;
break;
}
}
if(f==0) cout<<"None\n";
}
return 0;
}
汪恺恒在2021-03-09 13:00:50追加了内容
WA30
#include<bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
long long n,m,a[15],num[15],x,k;
bool check(long long arr[]){
if(arr[1]==0) return false;
int sum=0;
for(int i=1;i<=n;i++){
sum=sum*10+arr[i];
}
if((sum+x)%k==0) return true;
return false;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
num[i]=a[i];
}
while(m--){
cin>>x>>k;
bool f=0;
do{
if(check(num)){
f=1;
for(int i=1;i<=n;i++){
cout<<num[i];
}
cout<<endl;
break;
}
}while(next_permutation(num+1,num+1+n));
if(f==0) cout<<"None\n";
for(int i=1;i<=n;i++){
num[i]=a[i];
}
}
return 0;
WA40
#include<bits/stdc++.h>
#pragma GCC optimize(3)
using namespace std;
long long n,m,num[15],x,k;
bool check(long long arr[]){
if(arr[1]==0) return false;
int sum=0;
for(int i=1;i<=n;i++){
sum=sum*10+arr[i];
}
if((sum+x)%k==0) return true;
return false;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>num[i];
}
while(m--){
cin>>x>>k;
bool f=0;
do{
if(check(num)){
f=1;
for(int i=1;i<=n;i++){
cout<<num[i];
}
cout<<endl;
break;
}
}while(next_permutation(num+1,num+1+n));
if(f==0) cout<<"None\n";
}
return 0;
}
0
已采纳
张帆
中级天翼
中级天翼
生成排列的方法
do{
}while(next_permutation(a+1,a+1+n));
我的思路:
对于每组x和k
遍历排列1次,遍历代码,check函数你应该会。
do{
if(check(num)){
for(int i=1;i<=n;i++) cout<<num[i];
cout<<"\n";
flag=true;
break;
}
}while(next_permutation(num+1,num+1+n));
if(flag) continue;
cout<<"None\n";
0
0