数字实验
整体思路:数学+大模拟
不难发现,当n≥100时,结尾会有18个0。
这个时候只需要输出k个0即可(因为k不大于18)
判断代码如下
cin>>s>>k;//s是数字,用字符串存储
int l=s.size();
if(l>3){
for(int i=1;i<=k;i++) cout<<0;
cout<<endl;
return ;
}
int n=stoi(s);
if(n>=100){
for(int i=1;i<=k;i++) cout<<0;
cout<<endl;
return ;
}
当时比赛的时候,我的代码是0分
长这样
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
#define endl '\n';
void gmin(int &x,int y){x=min(x,y);}
void gmax(int &x,int y){x=max(x,y);}
string pt(int st,bool x){return st==1?x?"Yes":"No":x?"YES":"NO";}
string s;
int k;
void solve(){
cin>>s>>k;
int l=s.size();
if(l>3){
for(int i=1;i<=k;i++) cout<<0;
cout<<endl;
return ;
}
int n=stoi(s);
long long p=pow(10,k);
int sum=1;
for(int i=1;i<=n;i++){
sum*=i;
sum%=p;
}
int m=sum;
int di=0;
while(m) di++,m/=10;
if(di<k){
for(int i=1;i<=k-di;i++) cout<<0;
}
cout<<sum<<endl;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
int t=1;
cin>>t;
while(t--) solve();
}
首先,在最后输答案的时候,如果答案是0,那么我的程序会输出00,因为我代码认为0没有位数,所以要补一个零。因为循环的条件就是这样的。
所以,需要加一条特判
代码如下
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
#define endl '\n';
void gmin(int &x,int y){x=min(x,y);}
void gmax(int &x,int y){x=max(x,y);}
string pt(int st,bool x){return st==1?x?"Yes":"No":x?"YES":"NO";}
string s;
int k;
void solve(){
cin>>s>>k;
int l=s.size();
if(l>3){
for(int i=1;i<=k;i++) cout<<0;
cout<<endl;
return ;
}
int n=stoi(s);
long long p=pow(10,k);
int sum=1;
for(int i=1;i<=n;i++){
sum*=i;
sum%=p;
}
int m=sum;
int di=0;
//特判
if(m==0) di=1;
//特判位置一定要放对
while(m) di++,m/=10;
//如果特判放在这里,那么只有10分
if(di<k){
for(int i=1;i<=k-di;i++) cout<<0;
}
cout<<sum<<endl;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
int t=1;
cin>>t;
while(t--) solve();
}
这样便可以获得三十分
因为爆long long
如何避免呢?
1.数据类型开大一点,就可以了
当然我不是很会
2.可以把乘法拆开来,变成加法,边加边取模。
这个方法更有道理
我后来补题用的是第二种方法
代码如下
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using pii=pair<int,int>;
using pll=pair<ll,ll>;
#define endl '\n';
void gmin(int &x,int y){x=min(x,y);}
void gmax(int &x,int y){x=max(x,y);}
string pt(int st,bool x){return st==1?x?"Yes":"No":x?"YES":"NO";}
string s;
int k;
void solve(){
cin>>s>>k;
int l=s.size();
if(l>3){
for(int i=1;i<=k;i++) cout<<0;
cout<<endl;
return ;
}
int n=stoi(s);
if(n>=100){
for(int i=1;i<=k;i++) cout<<0;
cout<<endl;
return ;
}
long long p=pow(10,k);
long long ans=1;
for(int i=1;i<=n;i++){
long long cnt=ans;
for(int j=1;j<i;j++){
ans+=cnt;
ans%=p;
}
}
long long m=ans;
int di=0;
if(m==0) di=1;
while(m) di++,m/=10;
if(di<k){
for(int i=1;i<=k-di;i++) cout<<0;
}
cout<<ans<<endl;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
int t=1;
cin>>t;
while(t--) solve();
}
这个题目还是比较可惜的!

浙公网安备 33010602011771号