随笔—邀请赛前训— Codeforces Round #330 (Div. 2) B题

题意:

这道英文题的题意稍稍有点复杂。

找长度为n的数字序列有多少种。这个序列可以分为n/k段,每段k个数字。k个数可以变成一个十进制的数Xi。要求对这每n/k个数,剔除Xi可被ai整除的情况,剔除X的第一个数(包括前导0)是bi的情况。问剩下的组合有多少种。

思路:

这题我是一波三折的。首先也没有考虑很多,看着可以暴力模拟过程,我就直接开始敲了,几个for循环敲出来,再把bug调一调和特殊情况考虑考虑,交了之后开始TLE,这时候意识到复杂度太大了,于是开始优化,做了(b[i])*(mmax/10)-1    ~     (b[i]+1)*(mmax/10)-1    的循环范围优化后,后面的案例又超时了,后来觉得应该不能暴力模拟了,注意到一定范围内可以被一个数整除的数的数目是可以通过公式算的,这才用公式直接计算省去了for循环,这才过了题。

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std;

#define  MAX(x,y) (((x)>(y)) ? (x) : (y))
#define  MIN(x,y) (((x) < (y)) ? (x) : (y))
#define ABS(x) ((x)>0?(x):-(x))

const int inf = 0x7fffffff;
const int N=100000+10;
const long long mod=1e9+7;

int a[N];
int b[N];

int main()
{
//    freopen("out.txt", "w", stdout);
    int n;
    int k;
    cin>>n>>k;
    int kk=k;
    long long mmax=1;

    while(kk--)
        mmax *= 10;
//    cout<<mmax;

    int num=n/k;
    for(int i=0; i<num; i++)
        scanf("%d",a+i);
    for(int i=0; i<num; i++)
        scanf("%d",b+i);

    long long  ans=1;

    for(int i=0; i<num; i++)
    {
        long long cnt=(mmax-1)/a[i]+1;
        if(b[i] == 0){
            cnt-=(mmax/10-1)/a[i]+1;

        }
        else{
            cnt=cnt-( ((b[i]+1)*(mmax/10)-1)/a[i]+1 ) + ( ((b[i])*(mmax/10)-1)/a[i]+1 );

        }
        ans=ans*cnt % mod;
    }
    cout<<ans<<endl;
    return 0;
}
时间: 2024-10-06 22:09:32

随笔—邀请赛前训— Codeforces Round #330 (Div. 2) B题的相关文章

随笔—邀请赛前训— Codeforces Round #330 (Div. 2) Vitaly and Night

题意:给你很多对数,要么是0要么是1.不全0则ans++. 思路即题意. #include<cstdio> #include<cstring> #include<iostream> using namespace std; #define MAX(x,y) (((x)>(y)) ? (x) : (y)) #define MIN(x,y) (((x) < (y)) ? (x) : (y)) #define ABS(x) ((x)>0?(x):-(x))

随笔—邀请赛前训—Codeforces Round #327 (Div. 2) Rebranding

题意:一个字符串,做n次变换,每次变换是把a字符与b字符全部调换.求全部调换完成后的字符串. 这道题目我一开始理解错意思了,理解成将所有a字符变成b字符,我觉得这样出貌似还更有挑战性一点..口亨 #include<cstdio> #include<cstring> #include<map> #include<iostream> using namespace std; #define MAX(x,y) (((x)>(y)) ? (x) : (y))

随笔—邀请赛前训—Codeforces Round #328 (Div. 2) A. PawnChess

题意:给你一个8×8的棋盘分布,红黑棋子,双方只能朝上下其中一个方向移动,不可跨越对方或自己的棋子,最先到对面底部的人赢.问谁赢? 思路:上下2排同时开始扫,先扫到谁都棋,谁就赢(前提是没有对方的人挡路..) #include<cstdio> #include<cstring> #include<iostream> using namespace std; #define MAX(x,y) (((x)>(y)) ? (x) : (y)) #define MIN(x

随笔—邀请赛前练— Codeforces Round #329 (Div. 2) 2Char

题意:给你多个字符串,只保留2及2个以内的字符,丢弃多余的字符串,问你最后留下的字符串最长能有多长? 思路: 1. 对每个字符串处理出  process[fir][sec]  只包含fir字符和sec字符 当前的最大长度.当然,超过2个字符的字符串自动跳过. 2. 注意合并 process[fir][sec].process[sec][fir].process[fir][0].process[sec][0] 3. 合并的过程还要注意特殊情况 process[fir][0] + process[s

随笔—邀请赛前训—Wizards&#39; Duel

题意:给出一个距离,2端2个物体,给出速度v1,v2   相对前进,相遇后速度不变反弹,回端点都又速度不变反弹,求第二次相遇点位置. 思路:物理常识啊... #include<cstdio> #include<cstring> #include<iostream> using namespace std; #define MAX(x,y) (((x)>(y)) ? (x) : (y)) #define MIN(x,y) (((x) < (y)) ? (x)

Codeforces Round #257 (Div. 2) E题:Jzzhu and Apples 模拟

E. Jzzhu and Apples time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Jzzhu has picked n apples from his big apple tree. All the apples are numbered from 1 to n. Now he wants to sell them to

Codeforces Round #243 (Div. 1) A题

http://codeforces.com/contest/425/problem/A 题目链接: 然后拿出这道题目是很多人不会分析题目,被题目吓坏了,其中包括我自己,想出复杂度,一下就出了啊!真是弱! 直接暴力求出矩阵数值,然后枚举每一个[I,J];再O[N]判断,分配好在[I,J]区间的数和之内的数,再排序下SOLO了 CODE:#include <cstdio> #include <cstring>#include <queue>#include <vect

Codeforces Round #634 (Div. 3) 补题

A. Candies and Two Sisters 签到题,直接输出即可 代码 #include<bits/stdc++.h> #define INF 0x3f3f3f3f typedef long long ll; using namespace std; inline void read(int &p) { p=0;int flag=1;char c=getchar(); while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();} w

Codeforces Round #396 (Div. 2) D题Mahmoud and a Dictionary(并查集)解题报告

Mahmoud wants to write a new dictionary that contains n words and relations between them. There are two types of relations: synonymy (i. e. the two words mean the same) and antonymy (i. e. the two words mean the opposite). From time to time he discov