要知道:用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 }