第十一周周四总结

来源:互联网 发布:合同翻译软件 编辑:程序博客网 时间:2024/05/19 01:08

  这几天做的题感觉越来越难了,今天晚上做了一晚上就做了两个题,尤其是Q题,光看博客上的题解就看了半天没看懂。。。还有就是提交了几次都是因为提交错题了。。。尴尬,再看会这题题解12点睡觉吧。。

 

                                                                                            Y - odd-even number

For a number,if the length of continuous odd digits is even and the length of continuous even digits is odd,we call it odd-even number.Now we want to know the amount of odd-even number between L,R(1<=L<=R<= 9*10^18).

Input
First line a t,then t cases.every line contains two integers L and R.
Output
Print the output for each case on one line in the format as shown below.
Sample Input
2    1 100    110 220 
Sample Output
Case #1: 29Case #2: 36

#include<iostream>#include<stdio.h>#include<string.h>using namespace std;typedef long long LL;int a[30];long long dp[30][10][2][2];long long dfs(int p,int zq,bool zero,bool mz,bool limit){if(p==-1)    return mz;int up=limit?a[p]:9;LL& ans=dp[p][zq][zero][mz];if(!limit&&ans!=-1)    return ans;long long s=0;if(zero)    {    for(int i=0;i<=up;i++)        s+=dfs(p-1,i,i==0,!(i&1),limit&&i==up);    }else if(mz)    {    for(int i=0;i<=up;i++)        s+=dfs(p-1,i,0,(zq&1)&&!(i&1),limit&&i==up);    }else    {    for(int i=(zq&1);i<=up;i+=2)        s+=dfs(p-1,i,0,1,limit&&i==up);    }if(!limit)    ans=s;return s;}long long solve(long long x){int p=0;if(x==0)    return 1;while(x)    {    a[p]=x%10;    p++;    x/=10;    }return dfs(p-1,0,true,true,true);}int main(){int t;memset(dp,-1,sizeof(dp));long long aa,bb,s;scanf("%d",&t);for(int i=1;i<=t;i++)    {    scanf("%I64d %I64d",&aa,&bb);    s=solve(bb)-solve(aa-1);    cout<<"Case #"<<i<<": "<<s<<endl;    }return 0;}


                                                                  Q - count 数字计数

给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次。
Input
输入文件中仅包含一行两个整数a、b,含义如上所述。
Output
输出文件中包含一行10个整数,分别表示0-9在[a,b]中出现了多少次。
Sample Input
1 99
Sample Output
9 20 20 20 20 20 20 20 20 20
Hint

30%的数据中,a<=b<=10^6;
100%的数据中,a<=b<=10^12。

#include<iostream>using namespace std;long long n[15],m[15];long long f1[15],f2[15];int a[20];void csh(){m[0]=1;for(int i=1;i<15;i++)    {    n[i]=10*n[i-1]+m[i-1];    m[i]=m[i-1]*10;    }}void solve(long long x,long long *f){if(x==0)    return;int i,j;int p=0;long long xx=x;while(x)    {    a[++p]=x%10;    x/=10;    }for(i=1;i<p;i++)    {    f[0]+=n[i-1]*9;    for(j=1;j<10;j++)        f[j]+=n[i-1]*9+m[i-1];    }xx-=a[p]*m[p-1];for(i=1;i<a[p];i++)    f[i]+=m[p-1];for(i=0;i<10;i++)    f[i]+=n[p-1]*(a[p]-1);f[a[p]]+=xx+1;i=p-1;while(i)    {    xx-=a[i]*m[i-1];    for(j=0;j<a[i];j++)        f[j]+=m[i-1];    for(j=0;j<10;j++)        f[j]+=n[i-1]*a[i];    f[a[i]]+=xx+1;    i--;    }}int main(){long long aa,bb;while(cin>>aa>>bb)    {    csh();    solve(bb,f2);    solve(aa-1,f1);    for(int i=0;i<9;i++)        cout<<f2[i]-f1[i]<<" ";    cout<<f2[9]-f1[9]<<endl;    }return 0;}