Bzoj-1263[SCOI2006]整数划分

Posted zincsabian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bzoj-1263[SCOI2006]整数划分相关的知识,希望对你有一定的参考价值。

要知道:用n个a和m个b可以组合出$(a*b-a-b)$以上的所有数(Noip2017 Day1T1)

以下给出证明(From onion_cyc):

技术分享图片

所以我们可以知道2和3能够组合成$(2*3-2-3)=1$以上的所有数

然后...对于一个可以分解的数x,显然对于$∑ai = x$是小于$∏ai$的

那么对于一个数是分解成3的数量多好呢还是2的数量多好呢?

我们可以通过这个例子来知道答案:2^3<3^2

所以对于一个数n考虑分解成2和3...

以下提供思路:

当$n%3==1$的时候会用到2个2

当$n%3==0$的时候会用到0个2(因为整除)

当$n%3==2$的时候会用到1个2

(然后我w了两次= =,第一次是因为没有看到输出100个字符,第二次是把前100个字符看成后100个字符(w了还是w了...

代码

 

技术分享图片
 1 #include<cstdio>
 2 #include<iostream>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<map>
 6 #include<set>
 7 #include<vector>
 8 #include<cstring>
 9 using namespace std;
10 #define ll long long
11 #define inf 0x7fffffff
12 inline int read()
13 {
14     int x=0,f=1;char c=getchar();
15     while(c<0||c>9){if(c==-)f=-1;c=getchar();}
16     while(c>=0&&c<=9){x=x*10+c-0;c=getchar();}
17     return x*f;
18 }
19 inline ll readl()
20 {
21     ll x=0,f=1;char c=getchar();
22     while(c<0||c>9){if(c==-)f=-1;c=getchar();}
23     while(c>=0&&c<=9){x=x*10+c-0;c=getchar();}
24     return x*f;
25 }
26 inline int power(int a,int b)
27 {
28     int ans=1;
29     while(b)
30     {
31         if(b&1){ans=ans*a;--b;}
32         b>>=1;a=a*a;
33     }
34     return ans;
35 }
36 inline int power_mod(int a,int b,int mod)
37 {
38     a%=mod;
39     int ans=1;
40     while(b)
41     {
42         if(b&1){ans=ans*a%mod;--b;}
43         b>>=1;a=a*a%mod;
44     }
45     return ans;
46 }
47 inline int max(int a,int b){return a>b?a:b;}
48 inline int min(int a,int b){return a<b?a:b;}
49 int n,cnt,cnt2,len,a[5005];
50 inline void remove()
51 {
52     cnt=n/3;
53     if(n-cnt*3==1){cnt--;cnt2=2;}
54     else cnt2=(n%3==0?0:1);
55 }
56 inline void mul(int num)
57 {
58     for(int i=1;i<=len;i++)a[i]*=num;
59     for(int i=1;i<=len;i++)
60     {a[i+1]=a[i+1]+a[i]/10;a[i]=a[i]%10;/*printf("%d ",a[i]);*/}
61     while(a[len+1])
62     {len++;a[len+1]=a[len+1]+a[len]/10;a[len]=a[len]%10;/*printf("%d ",a[len]);*/}
63 //cout<<"\\n";
64 }
65 int main()
66 {
67     n=read();remove();len=1;a[1]=1;
68 //    printf("%d %d\\n",cnt,cnt2);
69     while(cnt--) mul(3);
70     while(cnt2--) mul(2);
71     printf("%d\\n",len);
72     for(int i=len;i>=max(1,len-100+1);i--) printf("%d",a[i]);cout<<"\\n";
73 }
View Code

 

以上是关于Bzoj-1263[SCOI2006]整数划分的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ1263 [SCOI2006]整数划分 高精度

Bzoj-1263[SCOI2006]整数划分

[bzoj1263]整数划分

BZOJ 1263 整数划分(数学+高精度)

Codeforces 986D Perfect Encoding FFT 分治 高精度

bzoj1263