mx 731 模拟赛记录
__S08577__ · · 个人记录
A
题意
Arc158C
思路
形象化题意:
其中,
显然,这个式子十分的不美观,且
举个例子:
相加得到:
第一个数的数位和为18,第二个数的数位和为24,两数和的数位和为15。
但是,仔细思考不难得出,进位一次,数位和会减去9。
所以,我们不难推出这个式子:
其中,
整个式子便可化为:
其中:
分析
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<stack>
#include<map>
#include<queue>
using namespace std;
#define int long long
#define ll long long
#define Endl cout<<endl;
#define xy cout<<"xy";
#define yx cout<<"yx";
#define pii pair<int,int>
#define ls(rt) tr[rt].ch[0]
#define rs(rt) tr[rt].ch[1]
#define lowbit(x) x&(-x)
const int N=1e6+5;//注意修改
const int mod=1e9+7;
const int Max=2e6+10;
int n,m;
int a[20][N],b[N];
signed main(){
int n;
cin>>n;
int sum=0;
for(int i=1;i<=n;i++) {
int t;
cin>>t;
int tmp=10;
for(int j=1;j<=15;j++){
a[j][i]=t%tmp;
tmp*=10;
}
while(t){
int tt=t%10;
sum+=tt;
t/=10;
}
}
sum*=2*n;
//cout<<sum<<endl;
int Tt=1;
for(int i=1;i<=15;i++){
Tt*=10;
sort(a[i]+1,a[i]+1+n);
for(int j=1;j<=n;j++){
sum-=9*(a[i]+n+1-lower_bound(a[i]+1,a[i]+1+n,Tt-a[i][j]));
}
}
cout<<sum<<endl;
return 0;
}
/*
*/
B
时间到了,写不了了,以后有时间在写。
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<vector>
#include<stack>
#include<map>
#include<queue>
using namespace std;
#define int long long
#define ll long long
#define Endl cout<<endl;
#define xy cout<<"xy";
#define yx cout<<"yx";
#define pii pair<int,int>
#define ls(rt) tr[rt].ch[0]
#define rs(rt) tr[rt].ch[1]
#define lowbit(x) x&(-x)
const int N=1e6+5;//注意修改
const int mod=1e9+7;
const int Max=2e6+10;
int n,m;
int a[20][N],b[N],p[N];
int x,k;
int sum=0,cnt=0;
int tot=0;
void dfs(int x,int y){ //要拆分得数是x,拆到了第y层
//cout<<x<<' '<<y<<endl;
if(tot>=100000) return ;
if(y==0||x==1){
tot++;
cout<<x<<' ';
sum+=x;
return ;
}
if(tot>=100000) return ;
for(int i=1;i<=cnt;i++){
if(p[i]>x||tot>100000) return ;
if(x%p[i]==0) dfs(p[i],y-1);
}
}
signed main(){
// freopen("digit.in","r",stdin);
// freopen("digit,out","w",stdout);
cin>>x>>k;
for(int i=1;i*i<=x;i++){
if(x%i==0) p[++cnt]=i;
}
int d=cnt;
for(int i=d;i>=1;i--){
if(p[i]*p[i]!=x){
p[++cnt]=x/p[i];
// cout<<p[i]<<' ';
}
}
// for(int i=1;i<=cnt;i++) {
// cout<<p[i]<<' ';
// }
dfs(x,k);
return 0;
}
/*
*/