65 条题解
-
1November (CLH_W) LV 10 @ 2022-04-20 19:02:45
#include<iostream> #include<string> #include<vector> using namespace std; string add(string str1,string str2); string mul(string str1,string str2); string calc(); vector<int> list; string ans; int main() { int n; cin>>n; int sum=0; for(int i=2;sum<n;i++) { list.push_back(i); sum+=i; } if(sum==n)//恰好多项式==n { ans=calc(); } else if(sum>n)//多项式>n { int k=sum-n; if(k==1)//刚好差1,舍弃2,最大位+1 { list.erase(list.begin(),list.begin()+1); list[list.size()-1]+=1; ans=calc(); } else//否则删除list中=k的那一项 { vector<int>::iterator it; int flag=0; for(it=list.begin();it<list.end();it++) { if(*it==k) { list.erase(it,it+1); flag=1; } if(flag) break; } ans=calc(); } } cout<<ans; return 0; } string add(string str1,string str2) { if(str1.length()<str2.length()) { string s; s=str1; str1=str2; str2=s; } string str; int len1=str1.length(); int len2=str2.length(); int dis=len1-len2; int cf=0; for(int i=len2-1;i>=0;i--) { int temp=str1[i+dis]-'0'+str2[i]-'0'+cf; cf=temp/10; temp=temp%10; str=char(temp+'0')+str; //cout<<"cf is "<<cf<<" temp is "<<temp<<endl; } for(int i=dis-1;i>=0;i--) { int temp=str1[i]-'0'+cf; cf=temp/10; temp=temp%10; str=char(temp+'0')+str; } if(cf>0) str=char(cf+'0')+str; if(str.find_first_not_of('0')==str.npos) str="0"; else str.erase(0,str.find_first_not_of('0')); return str; } string mul(string str1,string str2) { if(str1.length()<str2.length()) { string s; s=str1; str1=str2; str2=s; } string str="0"; string tempstr; int len1=str1.length(); int len2=str2.length(); int dis=len1-len2; int cf=0; for(int i=len2-1;i>=0;i--) { tempstr.clear(); cf=0; for(int j=len1-1;j>=0;j--) { int temp=(str1[j]-'0')*(str2[i]-'0')+cf; //cout<<"temp is "<<temp<<endl; cf=temp/10; //cout<<"cf is "<<cf<<endl; temp=temp%10; tempstr=char(temp+'0')+tempstr; //cout<<endl; } if(cf>0) tempstr=char(cf+'0')+tempstr; for(int k=1;k<=len2-1-i;k++) tempstr=tempstr+'0'; if(tempstr.find_first_not_of('0')==tempstr.npos) tempstr="0"; else tempstr.erase(0,tempstr.find_first_not_of('0')); //cout<<"tempstr is "<<tempstr<<endl; str=add(str,tempstr); //cout<<"str is "<<str<<endl; } if(str.find_first_not_of('0')==str.npos) str="0"; else str.erase(0,str.find_first_not_of('0')); return str; } string calc() { int flag=0; vector<int>::iterator it1; for(it1=list.begin();it1<list.end();it1++) { if(flag==0) { cout<<*it1; flag=1; } else cout<<" "<<*it1; } cout<<endl; vector<int>::iterator it; it=list.begin(); string s1; s1=char(*it+'0')+s1; //cout<<"s1: "<<s1<<endl; for(it=list.begin()+1;it<list.end();it++) { string s2; int temp=*it; while(temp)//当*it为两位,即12,13..时,无法通过 s2=char(*it+'0')+s2;一次获取s2了 { int tempyu=temp%10; s2=char(tempyu+'0')+s2; temp=temp/10; } //cout<<"s2: "<<s2<<endl; s1=mul(s1,s2); //cout<<"s2 is "<<s2<<" s1: "<<s1<<endl; } return s1; }
-
12009-11-14 10:21:49@
大水题
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0msvar
i,n,j,k,x:longint;
a:array[1..150]of longint;
f:array[0..300]of longint;
begin
readln(n); k:=1;
while n>0 do begin a[k]:=k+1;n:=n-k-1;inc(k);end;dec(k);
if n -
12009-07-21 23:11:50@
数列(升序)越长越好(不包括1),如果数列剩下的不够a[n-1]大时就分别平分给n个数
最后的数列就是答案,最后来个单精度,那你就可以AC了。Flag
Accepted
题号
P1520
类型(?)
贪心
通过
164人
提交
491次
通过率
33%
难度
2 -
02017-07-07 14:25:59@
var n,m,i,w,leng,t:longint; c,a:array[0..10000]of longint;
procedure cheng;
var j:longint;
begin
for j:=1 to leng do c[j]:=c[j]*a[i];
for j:=1 to leng-1 do
begin
c[j+1]:=c[j+1]+c[j] div 10;
c[j]:=c[j] mod 10;
end;
j:=leng;
while c[j]>=10 do
begin
c[j+1]:=c[j+1]+c[j] div 10;
c[j]:=c[j] mod 10;
inc(j);
end;
leng:=j;
end;
begin
readln(n);
m:=n;
i:=2;
while m>=i do
begin
inc(w);
a[w]:=i;
m:=m-i;
inc(i);
end;
t:=w-m+1;
while t<=1 do begin
for i:=w downto 1 do inc(a[i]);
t:=m-1;
end;
if t>1 then for i:=w downto t do inc(a[i]);
for i:=1 to w do write(a[i],' ');
writeln;
c[1]:=1;
leng:=1;
for i:=w downto 1 do cheng;
for i:=leng downto 1 do write(c[i]);
end. -
02017-07-07 14:25:41@
var n,m,i,w,leng,t:longint; c,a:array[0..10000]of longint;
procedure cheng;
var j:longint;
begin
for j:=1 to leng do c[j]:=c[j]*a[i];
for j:=1 to leng-1 do
begin
c[j+1]:=c[j+1]+c[j] div 10;
c[j]:=c[j] mod 10;
end;
j:=leng;
while c[j]>=10 do
begin
c[j+1]:=c[j+1]+c[j] div 10;
c[j]:=c[j] mod 10;
inc(j);
end;
leng:=j;
end;
begin
readln(n);
m:=n;
i:=2;
while m>=i do
begin
inc(w);
a[w]:=i;
m:=m-i;
inc(i);
end;
t:=w-m+1;
while t<=1 do begin
for i:=w downto 1 do inc(a[i]);
t:=m-1;
end;
if t>1 then for i:=w downto t do inc(a[i]);
for i:=1 to w do write(a[i],' ');
writeln;
c[1]:=1;
leng:=1;
for i:=w downto 1 do cheng;
for i:=leng downto 1 do write(c[i]);
end. -
02017-02-02 12:55:24@
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int n,now=2,lei=1;
int fen[10003];
struct bigint{
int len,dig[10005];
bigint();
bigint(int x);
void clear();
bigint operator*(bigint b);
//bigint operator*=(bigint b);
};bigint::bigint(){
len=1;
memset(dig,0,sizeof(dig));
}
bigint::bigint(int x){
len=0;
do
dig[++len]=x%10;
while(x/=10);
}
void bigint::clear(){
while(len>1&&dig[len]==0)
len--;
}
bigint bigint::operator*(bigint b){
bigint ret;
ret.len=len+b.len-1;
for(int i=1;i<=len;i++)
for(int j=1;j<=b.len;j++)
ret.dig[i+j-1]+=dig[i]*b.dig[j];
for(int i=1;i<=ret.len;i++){
ret.dig[i+1]+=(ret.dig[i]/10);
ret.dig[i]%=10;
}
if(ret.dig[ret.len+1])
ret.len++;
ret.clear();
return ret;
}
ostream& operator<<(ostream& os,const bigint& b){
for(int i=b.len;i>=1;i--){
os<<b.dig[i];
}
return os;
}//高精度模板
int main(){
cin>>n;
while(n!=0){
if(now>n){
int jia=lei-1;
for(int i=1;i<=n;i++){
fen[jia]++;
jia--;
if(jia==0){
jia=lei-1;
}
}
n=0;
}else{
fen[lei]=now;
lei++;
n-=now;
now++;
}
}
for(int i=1;i<=lei-2;i++){
cout<<fen[i]<<" ";
}
cout<<fen[lei-1];
cout<<endl;
bigint ans=1;
for(int i=1;i<=lei-1;i++){
ans=ans*bigint(fen[i]);
}
cout<<ans;
return 0;
}
话说为什么最后一个点98分 -
02016-12-24 17:21:27@
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#define maxa 10000
using namespace std;
typedef long long ll;
ll ans = 0;
vector<int>v,q,v1;
int sol(int x)
{
int i=1,sum = 0;
while(sum<x)
{
sum+=i;
i++;
}
return i-1;
}
bool check(vector<int> p)
{
int i;
sort(p.begin(),p.end());
for(i=0;i<p.size()-1;++i)
if(p[i]==p[i+1])
return false;
return true;
}
void dfs(int n,int tot)
{
int i;
if(n==0)
{
v1.clear();
for(i=0;i<v.size();++i)
v1.push_back(v[i]);
if(tot>ans&&check(v1))
{
q.clear();
ans = tot;
for(i=0;i<v.size();++i)
q.push_back(v[i]);
}
return ;
}
else
for(i=sol(n);i<=n;++i)
{
v.push_back(i);
dfs(n-i,i*tot);
v.pop_back();
}
}
int main()
{
int n,i,j,t,s;
cin>>n;
dfs(n,1);
sort(q.begin(),q.end());
for(i=0;i<q.size();++i)
cout<<q[i]<<" ";
cout<<endl;
cout<<ans;
return 0;
} -
02016-12-10 12:19:12@
#include <cstdio>
int a[1000];
int ans[1000]={1,1};
void ch(int a[],int m)
{int i;
for(i=1;i<=a[0];i++)
a[i]*=m;
for(i=1;i<=a[0]+6;i++)
{a[i+1]+=a[i]/10;
a[i]%=10;
}
for(i=a[0]+6;a[i]==0&&i>1;i--);
a[0]=i;
}
void prt(int a[])
{for(int i=a[0];i>=1;i--)
printf("%d",a[i]);
}
int main()
{int n,i,k;
long long s=1;
scanf("%d",&n);
if(n<5) {printf("%d\n%d",n,n);return 0; }for(i=2;i<=n;i++)
{a[i]=i;n=n-i;
}
k=i-1;i=k;
while(n>=1)
{a[i--]++;n--;if(i==1)i=k;}
for(i=2;i<=k;i++)
{
printf("%d ",a[i]);
ch(ans,a[i]);
}
printf("\n");
prt(ans);
return 0;
} -
02014-02-05 13:01:22@
这种水题,我竟WA了两次!生气啊!
第一次代码:#include<stdio.h>
#include<math.h>
long a[10001];
long n,num2,num3,i,j,k,x;
using namespace std;
int main()
{
scanf("%ld",&n);
if (n%3==0) num3=n/3;
else if (n%3==1)
{
num2=2;num3=(n-4)/3;
printf("2 2 ");
}
else if (n%3==2)
{
num2=1;num3=(n-2)/3;
printf("2 ");
}
for (i=1;i<num3;i++)
printf("3 ");
if (num3>0) printf("3");
printf("\n");
a[1]=long(pow(2,num2));k=1;
for (i=1;i<=num3;i++)
{
x=0;
for (j=1;j<=k;j++)
{
a[j]=a[j]*3+x;
x=long(a[j]/10);a[j]=a[j]%10;
}
while (x>0)
{
k++;a[k]=x%10;x=long(x/10);
}
}
for (i=k;i>0;i--)
printf("%ld",a[i]);
return 0;
}
因为没看清“不同的数字”,就简单地认为3越多越好。
第二次代码:
#include<stdio.h>
#include<math.h>
long long a[10001],x;
long p[10001];
long n,num2,num3,i,j,len,k;
using namespace std;
int main()
{
scanf("%ld",&n);
if (n<5)
{
printf("%ld\n%ld",n,n);
return 0;
}
p[1]=2;n-=2;len=1;
while (n>=p[len]+1)
{
len++;
p[len]=p[len-1]+1;
n-=p[len];
}
j=len;
while (n>0)
{
p[j]++;
n--;j--;
if (j=0) j=len;//注意这里!!!
}
for (i=1;i<len;i++)
printf("%ld ",p[i]);
printf("%ld\n",p[len]);
a[1]=1;k=1;
for (i=1;i<=len;i++)
{
x=0;
for (j=1;j<=k;j++)
{
a[j]=a[j]*p[i]+x;
x=(long long)(a[j]/10);
a[j]=a[j]%10;
}
while (x>0)
{
k++;a[k]=x%10;x=(long long)(x/10);
}
}
for (i=k;i>0;i--)
printf("%ld",a[i]);
return 0;
}
原来信心满满,打算直接AC,没想到WA了两个点。
我自己做了个数据:17,就发现了问题。原来,文中标出的地方==打成了=。
因为刚从P转过了,都不太熟练。导致此错误。
特此提醒自己,不要再犯低级错误了。BY JSB 绍兴一中万岁!
-
02010-03-05 17:56:12@
一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。 现在你的任务是将指定的正整数n分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。Input只一个正整数n,(30 do N有可能有剩余一部分完成使拆分结果为等差数列的拆分,上一个WHILE循环肯定还剩一部分无法拆分的部分,将其分摊到前面的数上,为了不使数列重复,我们从后分摊
begin
inc(a[i]);
dec(n);
dec(i);
if i=0 then i:=len;
end;
for i:=1 to len do write(a[i],' ');
writeln;
fillchar(max,sizeof(max),0);
long:=1; max[1]:=1;
for i:=1 to len do
begin
for j:=1 to long do
max[j]:=max[j]*a[i];
for j:=1 to long+10 do
begin
inc(max[j+1],max[j] div 10);
max[j]:=max[j] mod 10;
end;
inc(long,10);
while max[long]=0 do dec(long);
end;
for i:=long downto 1 do write(max[i]);
End. -
02009-10-31 15:12:58@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
02009-10-30 09:15:21@
不看题害死人呀~~
恩..的确是不同的自然数..
恩..鉴定完毕..注意 如果是任意分的话肯定要将n分为尽可能多的 3 ………
再插一句 LX的3 4 7……应该是3 4 6
-
02009-10-28 20:51:53@
lishunzhi数据蒙对的吧
如输入13
你输出3 4 5
60明摆着是3 4 7
72 -
02009-10-07 17:32:41@
注意。。
是互不相同的数字。。。。。只要从2,3,4一直分就好。。
分到不够了。。
剩下的,从高向低加1。最后高精乘一下就出答案了。。。
-
02009-09-24 18:36:15@
为什么不是这样的
k=n div 3; a=n mod 3;
如果 a=1 就 dec(k) 因为 4*3>3*3*1
如果 a=2 就是 3*2
所以就有 2*3*3*3*……*3*3*3
3*3*3*3*……*3*3*3
3*3*3*3*……*3*3*4…… 三种 使得 积最大。
3*3*3*2>3*4*4
3*3>2*2*2
……
ps:有意者请到讨论里面留个言,谢谢。 -
02009-09-23 16:57:57@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0msvar n,m,i,w,leng:longint; c,a:array[0..10000]of longint;
procedure cheng;
var j:longint;
begin
for j:=1 to leng do c[j]:=c[j]*a[i];
for j:=1 to leng-1 do
begin
c[j+1]:=c[j+1]+c[j] div 10;
c[j]:=c[j] mod 10;
end;
j:=leng;
while c[j]>=10 do
begin
c[j+1]:=c[j+1]+c[j] div 10;
c[j]:=c[j] mod 10;
inc(j);
end;
leng:=j;
end;
begin
readln(n);
m:=n;
i:=2;
while m>=i do
begin
inc(w);
a[w]:=i;
m:=m-i;
inc(i);
end;
for i:=w downto w-m+1 do inc(a[i]);
for i:=1 to w do write(a[i],' ');
writeln;
c[1]:=1;
leng:=1;
for i:=w downto 1 do cheng;
for i:=leng downto 1 do write(c[i]);
end. -
02009-09-20 11:36:53@
受不了,我在下面测4
怎么改都不对
交上居然过了
水! -
02009-09-19 20:00:50@
囧死了......刚开始我以为是分解成一堆3的说.....
交了2遍.......然后才发现是要分解成不同的数......囧死..... -
02009-09-16 21:44:00@
107/300(36%)
通过 255人
提交 706次
通过率 36%一次AC
提交三百次
纪念一下PS.通过率一样哦~
-
02009-09-12 16:23:47@
我得了1分。。。