把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

JZ训练记录Day17

问我前面Day16都去哪了?

吃了


为了推销个人Blog,今天开始所有训练博客统一移到此博客更新

3503. 粉刷(paint) 

Description

鸡腿想到了一个很高(sha)明(bi)的问题,墙可以看作一个N*M的矩阵,有一些格子是有污点的。现在鸡腿可以竖着刷一次,覆盖连续的最多C列,或者横着刷一次,覆盖连续的最多R行。现在鸡腿把墙上的情况告诉你,请你告诉鸡腿最少要刷多少次才能刷干净!
 

Input

第1行,输入俩正整数N,M。

第2到N+1行,每行一个长度为M的字符串,每个字符可能是’.’表示干净的,或者’X’表示这个格子有污点。

第N+2行,输入俩正整数表示R和C。

Output

输出一行一个整数,表示鸡腿最少要刷几次。
 

Sample Input

输入1:
1 9
XXXXXXXXX
2 3
输入2:

11 14
XXX..XXX..XXX.
.X..X....X...X
.X..X....X...X
.X..X....X...X
.X...XXX..XXX.
..............
...XX...XXX...
....X......X..
....X....XXX..
....X......X..
...XXX..XXX...
1 2

Sample Output

输出1:
1
输出2:
7
 

Data Constraint

对于50%的数据1≤N,M≤5;

对于100%的数据1≤N,M,R,C≤15。
Soultion:奇奇怪怪的题???貌似玄学贪心可以A,但是我只考虑全涂横向和全涂竖向的情况,居然85,实属送分题
Code:(没A)
 

3504. 运算符(calc) 

Description

鸡腿想到了一个很高(sha)明(bi)的运算符,那就是’!’,没错就是感叹号。他给了如下的定义:

1、n!k = n!(k-1) * (n-1)!k (n> 0 and k > 0)

2、n!k = 1 (n = 0)

3、n!k = n (k = 0)

现在鸡腿告诉你n和k你能告诉他n!k的不同约数个数有多少个吗?只要对1,000,000,009取模就可以了哦!
 

Input

一行,输入两个正整数n,k。

Output

一行,输出一个整数表示答案。
 

Sample Input

输入1:
3 1
输入2:
100 2

Sample Output

输出1:
4
输出2:
321266186
 

Data Constraint

对于30%的数据0 <n ≤ 10, 0 <k ≤ 10;

对于100%的数据0 <n ≤ 1000, 0 <k ≤ 100。
Soultion:其实很好写的Dp/递推,设f[i][j][k]表示i!j中第k号质数的数量,注意,k表示的是质数在质数表的位置而不是数字本身。
转移:f[i][j][k]=f[i-1][j][k]+f[i][j-1][k];(其实题目已经给你提供了)
然后处理j=0的边界条件即对f[i][0][k]中的i进行质因数分解
Code:
#include<bits/stdc++.h>
const int P=1000000009;
int Prime[210];
int F[1010][105][180],N,K;
using namespace std;
int main()
{
    
    Prime[1]=2;
    int Num=3,tot=1;
    while(tot<180){
        bool flag=false;
        for(int i=2;i*i<=Num;i++)
            if(Num%i==0)<% flag=1;break; %>
        if(!flag) Prime[++tot]=Num;
        Num++;
    }
    
    scanf("%d%d",&N,&K);
    
    for(int i=1;i<=N;i++){
        int A=i;
        for(int j=1;Prime[j]<=A;j++){
            while(A%Prime[j]==0) F[i][0][j]++,A/=Prime[j];
        }
    }
    
    for(int i=1;i<=N;i++)
        for(int j=1;j<=K;j++){
            for(int k=1;k<=tot;k++)    F[i][j][k]=(1ll*F[i][j-1][k]+1ll*F[i-1][j][k])%P;
    }
    
    long long Ans=1;
    for(int i=1;i<=tot;i++)
        Ans=(Ans*1ll*(F[N][K][i]+1))%P;
    
    printf("%lld",Ans);
    return 0;
}
 

6290. 倾斜的线 

Description

 

Input

Output

 

Sample Input

6 15698 17433
112412868 636515040
122123982 526131695
58758943 343718480
447544052 640491230
162809501 315494932
870543506 895723090 
 

Sample Output

193409386/235911335
 
 

Data Constraint

Soultion:旋转坐标系将给定斜率直线作为x轴,求出每个点与原点构成直线在新坐标系上的截距,从小到大排序之后,相邻点构成的直线一定会比较小所以O(n)扫一遍即可

Code:

#include<bits/stdc++.h>
typedef double dl;
using namespace std;
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
dl K;
struct Node{
    int X,Y;
    dl T()
    {
        return 1.0*Y-K*X;
    }
}Poi[2*100100];
bool cmp(Node a,Node b)<% return a.T()<b.T();%>
int main()
{
    freopen("slope.in","r",stdin);
    freopen("slope.out","w",stdout);
    int N,P,Q;
    scanf("%d%d%d",&N,&P,&Q);
    K=1.0*P/Q;
    for(int i=1;i<=N;i++) scanf("%d%d",&Poi[i].X,&Poi[i].Y);
    sort(Poi+1,Poi+N+1,cmp);
    dl Temp=1e9+7;
    int Pos=0;
    for(int i=1;i<N;i++){
        double xx=(Poi[i+1].X-Poi[i].X),yy=(Poi[i+1].Y-Poi[i].Y);
        dl Calc=1.0*yy/xx;
        if(fabs(Calc-K)<Temp){
            Temp=fabs(Calc-K);
            Pos=i;
        }
    }
    
    int Ans1=abs(Poi[Pos].X-Poi[Pos+1].X);
    int Ans2=abs(Poi[Pos].Y-Poi[Pos+1].Y);
    int Rikka=gcd(Ans1,Ans2);
    printf("%d/%d",Ans2/Rikka,Ans1/Rikka);
    return 0;
}

 

 

posted @ 2019-08-17 21:25  fluoce  阅读(213)  评论(0编辑  收藏  举报

Contact with me