题意
给你一个数,要求你将这个数拆成个每一位为或的数,如等。求的最小值,以及任意一种方案
分析
首先对于第一问,对于每个数位分析,你每次最多每个数位只能加,所以我们只需要找到数位里最大的那个数,那就是的最小值。对于任意一种方案,我们只需要每次求数位时,就需要当前位置数字个,用数组记录一下就好。
代码
#include<bits/stdc++.h> #define ll long long const int N=1e5+5,INF=0x3f3f3f3f,mod=998244353; using namespace std; int n,res,ans; int num[N]; inline int read() { register int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar(); return x*f; } int main() { n=read(); for(int i=1;i<=n;i*=10) { res=(n/i)%10; ans=max(ans,res); for(int j=1;j<=res;++j) num[j]+=i; } printf("%d\n",ans); for(int i=1;i<=ans;i++) printf("%d ",num[i]); return 0; }
后记
对了,依旧不让用万能头呢/weixiao