1. 程式人生 > >Bzoj-1263[SCOI2006]整數劃分

Bzoj-1263[SCOI2006]整數劃分

num cst -a bsp post str class span names

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