51nod数字1的数量
这道题瞎jbyy了很久 方法可能很奇怪...
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define LL long long using namespace std; int n,ans; int f[35][10],w[11]; void init(){ w[1]=1; for(int i=2;i<=10;i++) w[i]=w[i-1]*10; f[1][1]=1; for(int i=2;i<=10;i++) for(int j=0;j<=9;j++){ for(int k=0;k<=9;k++)f[i][j]+=f[i-1][k]; if(j==1) f[i][j]+=w[i]; } //for(int i=1;i<=10;i++,printf("\n")) for(int j=0;j<=9;j++) printf("%d ",f[i][j]); } int main() { init(); int sum=10,ans=0,v,k,tot=2; scanf("%d",&n); k=n; while(w[sum]>n) sum--; int now=n/w[sum]; for(int i=0;i<now;i++) ans+=f[sum][i]; n=n%w[sum]; for(int i=sum-1;i;i--){ v=n/w[i]; for(int j=0;j<v;j++) ans+=f[i][j]; n=n%w[i]; } v=k; if(k%10==1) ans++; v=v/10; while(tot<=sum){ if(v%10==1) ans=ans+k%w[tot]+1; tot++; v=v/10; } printf("%d\n",ans); return 0; }