CodeForces 595B

Posted 猫哥小俊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CodeForces 595B相关的知识,希望对你有一定的参考价值。

题意:有一个n位的电话号码,每位电话号码将分成n/k段,每段均为k为,求出满足以下要求的电话号码个数

1)第i段可以整除a[i];

2)第i段不能以数字b[i]开头。

题解:

1、 第i段能被a[i]整除的的个数z=(10^k-1)/a[i]+1;

2、 能被a[i]整除但以b[i]开头的个数y有:设 MIN=b[i]*10^(k-1),MAX=(b[i]+1)*10^(k-1)-1;

    ①如果MIN/a[i]*a[i]=MIN, 则y=(MAX-MIN)/a[i]+1;

  ②如果①条件不满足,如果(MIN/a[i]+1)*a[i]<=MAX, 则y=(MAX-(MIN/a[i]+1)*a[i])/a[i]+1;

通过1和2可以得出第i段满足的号码个数为c[i]=z-y;将每一段满足情况的个数求出来,将它们乘起来就可以求出所要答案。

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

long long mod=1000000007;
long long a[100000];
long long b[100000];
long long c[100000];

int main()
{
    long long n,k;
    scanf("%lld%lld",&n,&k);
    for(int i=0;i<n/k;i++)
        scanf("%lld",&a[i]);
    for(int i=0;i<n/k;i++)
        scanf("%lld",&b[i]);
    long long x=1;
    for(long long i=0;i<k;i++)
        x*=10;
    //cout<<x<<endl;
    for(long long i=0;i<n/k;i++)
    {
        c[i]=(x-1)/a[i]+1;
        long long MIN=b[i]*x/10;
        long long MAX=(b[i]+1)*x/10-1;
        long long temp=MIN/a[i];
        if(temp*a[i]==MIN)
             c[i]=c[i]-(MAX-MIN)/a[i]-1;
        else if((temp+1)*a[i]<=MAX)
        {
            MIN=(temp+1)*a[i];
            c[i]=c[i]-(MAX-MIN)/a[i]-1;
        }
    }
    // for(int i=0;i<n/k;i++)
    //     cout<<c[i]<<\' \';
    // cout<<endl;
    long long ans=1;
    for(long long i=0;i<n/k;i++)
    {
        ans=((c[i]%mod)*ans)%mod;
    }
    printf("%lld\\n",ans);
    return 0;
}
View Code

 

以上是关于CodeForces 595B的主要内容,如果未能解决你的问题,请参考以下文章

[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段

c_cpp Codeforces片段

Codeforces 86C Genetic engineering(AC自动机+DP)

CodeForces 1005D Polycarp and Div 3(思维贪心dp)

(Incomplete) Codeforces 394 (Div 2 only)

CodeForces 931F Teodor is not a liar!