码迷,mamicode.com
首页 > 其他好文 > 详细

Bzoj-1263[SCOI2006]整数划分

时间:2018-02-11 23:41:24      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:inline   rem   个数   nio   例子   names   合成   tor   return   

要知道:用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]整数划分

标签:inline   rem   个数   nio   例子   names   合成   tor   return   

原文地址:https://www.cnblogs.com/ZincSabian/p/8443359.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!