179 条题解
-
0liyinghaowei LV 10 @ 2014-07-06 22:13:13
终于ac
要把1和2都分析到
我就这样98 -
02014-07-06 22:12:27@
program p1033;
var
a:array[1..350]of longint;
c,n,i:longint;
begin
readln(n);
if n=1 then begin writeln(1);halt;end;
if n=2 then begin writeln(2);halt;end;
c:=1;
case n mod 3 of
0:a[1]:=1;
1:begin n:=n-4; a[1]:=4; end;
2:begin n:=n-2; a[1]:=2; end;
end;
repeat
n:=n-3;
for i:=1 to c do
a[i]:=a[i]*3;
for i:=1 to c do
begin
a[i+1]:=a[i+1]+a[i]div 10;
a[i]:=a[i]mod 10;
end;
if a[c+1]>0 then inc(c);
until n=0;
for i:=c downto 1 do
write(a[i]);
end. -
02014-02-01 11:25:07@
其实很简单,数学题而已
对于这道题,记得小学奥赛做过,
要得到最大值就要**把n尽量拆成3,但是如果拆到最后发现只剩下1的时候应当拿出一个3和剩下的1凑成4**(当然凑成之后可以分成2+2但是不影响结果)
所以m的值和好确定
a%3
0:m=3^(n/3);
1:m=3^(n/3-1)*4
2:m=3^(n/3)*2
剩下的就简单了,只过了几个点?
谁叫你这么急,要知道n=1500,m=3^500,早就爆了最大的long long了.高精度是肯定的,而且算次方肯定要快速幂呀(虽然不快速幂也能过).
什么还是没过,那是因为有特俗情况1一下是本人代码,代码基本给予麦森数(麦森数是基于高精度乘加了个快速幂)改了一下main的调用和输出函数
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#define M 10
#define N 250
typedef int big[250];
void base_big(void *a)
{
memset(a,0,sizeof(big));
}
void smlt(int *r,int b,int *a,int n)
{
int static i;
for (i = 0;i < n-1;i++) {
*(r+i) += *(a+i)*b;
*(r+i+1) += *(r+i)/M;
*(r+i) %= M;
}
if (i < n) (r+i) = ((a+i)*b+*(r+i))%M;
}
void mlt(int *r,int *b,int a)
{
int static j;
base_big(r);
for (j = 0;j < N;j++) smlt(r+j,(b+j),a,N-j);
}
void init_big(int *a)
{
char s[N+1];
int i,l;
scanf("%s",s); l = strlen(s)-1;
base_big(a);
for (i = l;i >= 0;i--) *(a+l-i) = s[i]-'0';
}
void print(big *a)
{
int i;
for (i = N-1;i > 0;i--) if ((*a)[i]) break; printf("%d",(*a)[i]);
for (i--;i >= 0;i--) printf("%d",(*a)[i]);
}
big tmp;
void power(int *r,int *a,int n)
{
if (n == 0) {
base_big(r);
*r = 1;
return;
}
if (n == 1) {
memcpy(r,a,sizeof(big)); return;
} else if (n&1) {
power(r,a,n>>1);
mlt(tmp,r,r);
mlt(r,tmp,a);
} else {
power(r,a,n>>1);
mlt(tmp,r,r);
memcpy(r,tmp,sizeof(big));
}
}
int main()
{
big a,c,cc;
int n;
base_big(&a); a[0] = 3;
base_big(&cc);
scanf("%d",&n);
if (n <= 3)
printf("%d",n); else
switch (n%3) {
case 1:
power(c,a,n/3-1);
cc[0] = 4;
mlt(a,c,cc);
print(&a);
break;
case 2:
power(c,a,n/3);
cc[0] = 2;
mlt(a,c,cc);
print(&a);
break;
case 0:
power(c,a,n/3);
print(&c);
break;
}
return 0;
} -
02013-10-22 23:06:18@
高精+DP
f[1]=1, f[2]=2, f[3]=3
f[n]=max{2*f[n-2], 3*f[n-3]} (n>=4) -
02013-10-09 21:41:32@
- 没啥,高精度计算 *39数据是1,被坑死了,要特判 ###Block Code #include<iostream> #include<cstdio>
using namespace std;
class hugeint
{
public:
int a[1001],n;
void init()
{
n=1;
a[1]=1;
}
void print()
{
while(a[n]==0)n--;
for(int i=n;i>=1;i--){
cout<<a[i];
}
cout<<endl;
}
friend hugeint operator*(hugeint a,int b)
{
hugeint c;
int gw=0;
for(int i=1;i<=a.n;i++){
c.a[i]=a.a[i]*b+gw;
gw=c.a[i]/10;
c.a[i]%=10;
}
c.n=a.n;
while(gw>0){
c.a[++c.n]=gw%10;
gw/=10;
}
return c;
}
};int main()
{hugeint a;
a.init();
int n;
cin>>n;
if(n==1){
cout<<1<<endl;
return 0;
}
if(n%3==1){
a=a*4;
n-=4;
}
if(n%3==2){
a=a*2;
n-=2;
}
for(int i=1;i<=n/3;i++){
a=a*3;
}
// cout<<a.n<<endl;
a.print();
return 0;
} -
02013-10-03 15:29:48@
一上来没考虑数据大小啊,跪了一下。然后调整了一下没什么问题了。一个数字最差情况也是1,所以先默认1。往上面乘。输入大于2且不等于4时乘3,然后让输入的数据-3继续循环。如果不符条件了看是不是大于1,大于就乘2,让输入-2。减下来要么剩1要么剩0,都不用考虑。高精那块懒得写函数了,复制黏贴了三遍。
C++ Code:
#include <iostream>
using namespace std;int main(){
int a;
int result[300];for(int i=0;i<=299;i++){
result[i]=0;
}result[0]=1;
cin>>a;while(a>=3 && a!=4){
int temp[300];
for(int i=0;i<=299;i++){
temp[i]=result[i];
}
for(int i=0;i<=299;i++){
result[i]+=temp[i];
if(result[i]>=10){
result[i]-=10;
result[i+1]+=1;
}
}for(int i=0;i<=299;i++){
result[i]+=temp[i];
if(result[i]>=10){
result[i]-=10;
result[i+1]+=1;
}
}
a -=3;
}while(a>1){
int temp[300];
for(int i=0;i<=299;i++){
temp[i]=result[i];
}
for(int i=0;i<=299;i++){
result[i]+=temp[i];
if(result[i]>=10){
result[i]-=10;
result[i+1]+=1;
}
}a-=2;
}int start=0;
for(int i=299;i>=0;i--){
if(result[i]!=0){
start=i;
break;
}}
for (int i=start;i>=0;i--){
cout<<result[i];
}}
-
02013-08-07 23:48:24@
当然,高精度的部分最好用函数来解决。鄙人这个地方没有优化,程序可读性有所下降
-
02013-08-07 23:47:44@
#include<iostream>
#include<string>
#include<cstring>using namespace std;
int main(){
int a[1001] = {0}, w[1001], n;
cin >> n;
if (n == 1)
{
cout << 1 << endl;
return 0;
}
a[1] = 1;
memset(w, 0, sizeof(w));
int rmndr = n % 3, qtnt;
//cout << "REMINDER = " << rmndr << endl;
if (rmndr == 0)
{
qtnt = n / 3;
//cout << "QUOTIENT = " << qtnt << endl;
for (int i = 1; i <= qtnt; i ++)
{
memset(w, 0, sizeof(w));
for (int j = 1; j <= 1000; j ++)
{
a[j] = a[j] * 3 + w[j - 1];
w[j] = a[j] / 10;
a[j] %= 10;
}
}
int p = 900;
while (a[p] == 0)p --;
//cout << "MULTIPLE = ";
for (int i = p; i >= 1; i --)cout << a[i];
}
else if (rmndr == 1)
{
qtnt = n / 3;
//cout << "QUOTIENT = " << qtnt << endl;
qtnt -= 1;
for (int i = 1; i <= qtnt; i ++)
{
memset(w, 0, sizeof(w));
for (int j = 1; j <= 1000; j ++)
{
a[j] = a[j] * 3 + w[j - 1];
w[j] = a[j] / 10;
a[j] %= 10;
}
}
for (int i = 1; i <= 1000; i ++)
{
a[i] = a[i] * 4 + w[i - 1];
w[i] = a[i] / 10;
a[i] %= 10;
}
int p = 900;
while (a[p] == 0)p --;
//cout << "MULTIPLE = ";
for (int i = p; i >= 1; i --)cout << a[i];
}
else if (rmndr = 2)
{
qtnt = n / 3;
//cout << "QUOTIENT = " << qtnt << endl;
for (int i = 1; i <= qtnt; i ++)
{
memset(w, 0, sizeof(w));
for (int j = 1; j <= 1000; j ++)
{
a[j] = a[j] * 3 + w[j - 1];
w[j] = a[j] / 10;
a[j] %= 10;
}
}
for (int i = 1; i <= 1000; i ++)
{
a[i] = a[i] * 2 + w[i - 1];
w[i] = a[i] / 10;
a[i] %= 10;
}
int p = 900;
while (a[p] == 0)p --;
//cout << "MULTIPLE = ";
for (int i = p; i >= 1; i --)cout << a[i];
}
return 0;
}
一定要注意n=1的情况!可以看到在程序的最前面我做了一个处理:n=1时输出1直接退出。
被n=1坑的够惨,第一次49个点中48个正确,WA一个,结果n=1。。。后来AC了 -
02013-07-17 19:58:26@
#include<stdio.h>
#include<stdlib.h>
static int array[3000];
void jingwei()
{
int k;
int i;
int j;
for(i=0;i<3000;i++)
{
if(array[i]>9)
{
k=array[i]/10;
array[i]=array[i]%10;
array[i+1]=array[i+1]+k;
}
}
}
void chengfa(int n)
{
int i;
for(i=0;i<3000;i++)
{
array[i]=array[i]*n;
}
}
int main()
{
int n,i,j,k;
scanf("%d",&n);
array[0]=1;
if(n%3==1)
{
k=n/3;
for(i=0;i<k-1;i++)
{
chengfa(3);
jingwei();
}
chengfa(4);
jingwei();
}
if(n%3==2)
{
k=n/3;
for(i=0;i<k;i++)
{
chengfa(3);
jingwei();
}
chengfa(2);
jingwei();
}
if(n%3==0)
{
k=n/3;
for(i=0;i<k;i++)
{
chengfa(3);
jingwei();
}
}
j=3000;
int flag=1;
while(flag)
{
j--;
if(array[j]!=0)flag=0;
}
if(n==1)printf("1");
else for(i=j;i>=0;i--)
printf("%d",array[i]);
return 0;
}
要考虑1的时候不能直接乘4。。。 -
02013-04-24 20:43:48@
要细心
program p1033;
var m:longint;
n:string;
procedure getdata;
begin
readln(m);
end;
procedure multiply(n:integer;var s:string);
var a:array[1..500] of integer;
i,leng:longint;
begin
leng:=length(s);
fillchar(a,sizeof(a),0);
for i:=1 to length(s) do
a[length(s)-i+1]:=ord(s[i])-ord('0');
for i:=1 to length(s) do
a[i]:=a[i]*n;
for i:=1 to length(s) do
if a[i]>=10 then
begin
a[i+1]:=a[i+1]+(a[i] div 10);
a[i]:=a[i] mod 10;
end;
s:='';
if a[leng+1]>0 then
for i:=leng+1 downto 1 do
s:=s+chr(a[i]+ord('0'))
else
for i:=leng downto 1 do
s:=s+chr(a[i]+ord('0'));end;
procedure output;
begin
writeln(n);
end;
function judge(s:longint):longint;
begin
if (s=1)or(s=2)or(s=3) then
judge:=s-1
else begin
judge:=(s mod 3)+3;
end;
end;
procedure calc(s:longint;var n:string);
var i:longint;
begin
n:='1';
case judge(s) of
0:n:='1';
1:n:='2';
2:n:='3';
3:begin
for i:=1 to (s div 3) do
multiply(3,n);
end;
4:begin
for i:=1 to ((s div 3)-1) do
multiply(3,n);
for i:=1 to 2 do
multiply(2,n);
end;
5:begin
for i:=1 to (s div 3) do
multiply(3,n);
multiply(2,n);
end;
end;
end;
begin
getdata;
calc(m,n);
output;
end.
测试数据 #0: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #1: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #2: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #3: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #4: Accepted, time = 0 ms, mem = 632 KiB, score = 2
测试数据 #5: Accepted, time = 0 ms, mem = 632 KiB, score = 2
测试数据 #6: Accepted, time = 0 ms, mem = 632 KiB, score = 2
测试数据 #7: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #8: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #9: Accepted, time = 0 ms, mem = 632 KiB, score = 2
测试数据 #10: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #11: Accepted, time = 0 ms, mem = 632 KiB, score = 2
测试数据 #12: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #13: Accepted, time = 0 ms, mem = 632 KiB, score = 2
测试数据 #14: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #15: Accepted, time = 0 ms, mem = 632 KiB, score = 2
测试数据 #16: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #17: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #18: Accepted, time = 0 ms, mem = 632 KiB, score = 2
测试数据 #19: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #20: Accepted, time = 0 ms, mem = 632 KiB, score = 2
测试数据 #21: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #22: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #23: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #24: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #25: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #26: Accepted, time = 0 ms, mem = 632 KiB, score = 2
测试数据 #27: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #28: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #29: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #30: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #31: Accepted, time = 0 ms, mem = 632 KiB, score = 2
测试数据 #32: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #33: Accepted, time = 2 ms, mem = 632 KiB, score = 2
测试数据 #34: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #35: Accepted, time = 0 ms, mem = 632 KiB, score = 2
测试数据 #36: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #37: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #38: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #39: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #40: Accepted, time = 0 ms, mem = 632 KiB, score = 2
测试数据 #41: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #42: Accepted, time = 0 ms, mem = 632 KiB, score = 2
测试数据 #43: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #44: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #45: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #46: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #47: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #48: Accepted, time = 3 ms, mem = 632 KiB, score = 2
测试数据 #49: Accepted, time = 3 ms, mem = 632 KiB, score = 2
Accepted, time = 141 ms, mem = 632 KiB, score = 100
有几位神犇0ms 过的 求指教 -
02013-02-16 10:14:57@
-
02012-11-05 17:13:19@
Var
i,j,k,m,n:Longint;
ans:Int64;
Begin
Read(n);
ans:=1;
While n-3>1 Do
Begin
ans:=ans*3;
n:=n-3;
End;
If n=4 Then Writeln(ans*4);
If n=3 Then Writeln(ans*3);
If n=2 Then Writeln(ans*2);End.
-
02012-10-17 09:21:12@
http://user.qzone.qq.com/1304445713/blog/1350436781
完整证明过程及C++高精度类代码。
空间不设访问权限,没有烦人的登录动画。
最近努力写各个OJ的题解,虽然都是些基础向的题目。
欢迎大家光临~ -
02009-11-11 16:30:44@
大家都知道,如果这题分解个数可以为实数(比较抽象)且不一定分解成整数的话,那么分出(n/e)个e是最优解
证明略..有兴趣的同学不妨自己推导一番.
e=2.718281828..
显然它比较靠近3,对比可知3越多越好,但是分解个数是整数,所以还要考虑分配平均的问题,这样不难得到下面大牛们的证明. -
02009-11-07 16:38:27@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
├ 测试数据 13:答案正确... 0ms
├ 测试数据 14:答案正确... 0ms
├ 测试数据 15:答案正确... 0ms
├ 测试数据 16:答案正确... 0ms
├ 测试数据 17:答案正确... 0ms
├ 测试数据 18:答案正确... 0ms
├ 测试数据 19:答案正确... 0ms
├ 测试数据 20:答案正确... 0ms
├ 测试数据 21:答案正确... 0ms
├ 测试数据 22:答案正确... 0ms
├ 测试数据 23:答案正确... 0ms
├ 测试数据 24:答案正确... 0ms
├ 测试数据 25:答案正确... 0ms
├ 测试数据 26:答案正确... 0ms
├ 测试数据 27:答案正确... 0ms
├ 测试数据 28:答案正确... 0ms
├ 测试数据 29:答案正确... 0ms
├ 测试数据 30:答案正确... 0ms
├ 测试数据 31:答案正确... 0ms
├ 测试数据 32:答案正确... 0ms
├ 测试数据 33:答案正确... 0ms
├ 测试数据 34:答案正确... 0ms
├ 测试数据 35:答案正确... 0ms
├ 测试数据 36:答案正确... 0ms
├ 测试数据 37:答案正确... 0ms
├ 测试数据 38:答案正确... 0ms
├ 测试数据 39:答案正确... 0ms
├ 测试数据 40:答案正确... 0ms
├ 测试数据 41:答案正确... 0ms
├ 测试数据 42:答案正确... 0ms
├ 测试数据 43:答案正确... 0ms
├ 测试数据 44:答案正确... 0ms
├ 测试数据 45:答案正确... 0ms
├ 测试数据 46:答案正确... 0ms
├ 测试数据 47:答案正确... 0ms
├ 测试数据 48:答案正确... 0ms
├ 测试数据 49:答案正确... 0ms
├ 测试数据 50:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms -
02009-11-06 22:58:45@
编译通过...
├ 测试数据 01:答案正确... 0ms
├ 测试数据 02:答案正确... 0ms
├ 测试数据 03:答案正确... 0ms
├ 测试数据 04:答案正确... 0ms
├ 测试数据 05:答案正确... 0ms
├ 测试数据 06:答案正确... 0ms
├ 测试数据 07:答案正确... 0ms
├ 测试数据 08:答案正确... 0ms
├ 测试数据 09:答案正确... 0ms
├ 测试数据 10:答案正确... 0ms
├ 测试数据 11:答案正确... 0ms
├ 测试数据 12:答案正确... 0ms
├ 测试数据 13:答案正确... 0ms
├ 测试数据 14:答案正确... 0ms
├ 测试数据 15:答案正确... 0ms
├ 测试数据 16:答案正确... 0ms
├ 测试数据 17:答案正确... 0ms
├ 测试数据 18:答案正确... 0ms
├ 测试数据 19:答案正确... 0ms
├ 测试数据 20:答案正确... 0ms
├ 测试数据 21:答案正确... 0ms
├ 测试数据 22:答案正确... 0ms
├ 测试数据 23:答案正确... 0ms
├ 测试数据 24:答案正确... 0ms
├ 测试数据 25:答案正确... 0ms
├ 测试数据 26:答案正确... 0ms
├ 测试数据 27:答案正确... 0ms
├ 测试数据 28:答案正确... 0ms
├ 测试数据 29:答案正确... 0ms
├ 测试数据 30:答案正确... 0ms
├ 测试数据 31:答案正确... 0ms
├ 测试数据 32:答案正确... 0ms
├ 测试数据 33:答案正确... 0ms
├ 测试数据 34:答案正确... 0ms
├ 测试数据 35:答案正确... 0ms
├ 测试数据 36:答案正确... 0ms
├ 测试数据 37:答案正确... 0ms
├ 测试数据 38:答案正确... 0ms
├ 测试数据 39:答案正确... 0ms
├ 测试数据 40:答案正确... 0ms
├ 测试数据 41:答案正确... 0ms
├ 测试数据 42:答案正确... 0ms
├ 测试数据 43:答案正确... 0ms
├ 测试数据 44:答案正确... 0ms
├ 测试数据 45:答案正确... 0ms
├ 测试数据 46:答案正确... 0ms
├ 测试数据 47:答案正确... 0ms
├ 测试数据 48:答案正确... 0ms
├ 测试数据 49:答案正确... 0ms
├ 测试数据 50:答案正确... 0ms
---|---|---|---|---|---|---|---|-
Accepted 有效得分:100 有效耗时:0ms虽然是因为数据弱
但还是一个字:爽 -
02009-11-04 19:13:42@
同一个程序叫了两遍就AC了.........
那个超时得点怎么解决
虽然过了但是总觉得很猥琐....... -
02009-11-01 13:50:41@
http://hi.baidu.com/lehrlukas/blog/item/6bbb88fc9d8f571c08244d31.html
除了1要特殊判别一下,其它数据看除以3余几,就有余数个2,其余全是3.然后一个高精度乘法搞定。至于为什么这样最大,这里有人证明过了。粘一下,不介意吧?
(song19931218的证明)
经典的数学题:
若将N分解成以下形式:
N=x1+x2+...+xk;
首先证明:
x(i) -
02009-10-31 14:37:13@
一星半纪念题
-
02009-10-29 16:27:46@
我数学太弱了..参照大牛的方法过了..ToT..!!!
program vijos1033;
type bignum=array[0..1000]of integer;
var n,ans,rem:integer;
a:bignum;function mul(a:bignum;b:integer):bignum;
var i,x:integer;
begin
i:=1; x:=0;
for i:=1 to a[0] do
begin
x:=x+a[i]*b;
a[i]:=x mod 10;
x:=x div 10;
end;
while x>0 do
begin
inc(i);
a[i]:=x mod 10;
x:=x div 10;
end;
a[0]:=i;
mul:=a;
end;function fang(a:bignum;b:integer):bignum;
var i:integer;
begin
for i:=1 to b do
a:=mul(a,3);
fang:=a;
end;begin
readln(n); a[0]:=1; a[1]:=1;
if n=1 then begin write(1); exit; end;
ans:=n div 3; rem:=n mod 3;
case rem of
0:a:=fang(a,ans);
1:a:=mul(fang(a,ans-1),4);
2:a:=mul(fang(a,ans),2);
end;
for n:=a[0] downto 1 do
write(a[n]);
end.