2019杭电多校第五场补题

1001:fraction

bx≡a(mod p)可以转换为:bx-kp = a.因为a的范围是(0,b),则列出不等式
又因为1 则有 p x < = b k < = p x − 1 \frac{p}{x}<=\frac{b}{k}<=\frac{p}{x-1} xp<=kb<=x1p。据说是一个经典问题:
给你a,b,c,d,求最简分式 x y \frac{x}{y} yx满足 a b < = x y < = c d \frac{a}{b}<=\frac{x}{y}<=\frac{c}{d} ba<=yx<=dc
如果a/b != c/d(此处为整除),那么x=(a/b)+1,y=1,得到解。否则
设t=(a/b),不等式同时减去t得到:
a − t b b < = x − t y y < = c − t d d \frac{a-tb}{b}<=\frac{x-ty}{y}<=\frac{c-td}{d} batb<=yxty<=dctd,可化为:
d c − t d < = y x − t y < = b a − t b \frac{d}{c-td}<=\frac{y}{x-ty}<=\frac{b}{a-tb} ctdd<=xtyy<=atbb化为了另一个相同的问题
递归处理直到得到解,再一步一步解出之前的解。

#include
#define ll long long
using namespace std;
void gao(ll a, ll b, ll c, ll d, ll &x, ll &y){
    if((a/b) < (c/d)){
        x = (a/b)+1; y = 1; return;
    }
    ll t = a/b;
    ll x1, y1;
    gao(d, c - t*d, b, a-t*b, x1, y1);
    y = x1;
    x = y1 + t*y;
    return;
}
int main()
{
	int T;cin>>T;
	while(T--){
        ll x, p;
        scanf("%lld%lld", &p, &x);
        ll b, k;
        gao(p, x, p, x-1, b, k);
        ll a = b*x - k*p;
        printf("%lld/%lld\n", a, b);
	}
}

1002:three arrays

两个数组各建立一棵字典树,然后查找的时候从高位到低位,如果可以配出0就优先配出0,否则只能配出1然后递归子树。这样贪心的得到c数组之后排序即为答案。

#include
#define ll long long
using namespace std;
const int maxn = 1e5 + 50;
struct node{
    int ch[2];
    int cnt;

}e[maxn*60];
int r1, r2, tot;
void Insert(int rt, int x){
    int p = rt;
    for(int i = 29; i >= 0; --i){
        int t = !!(x&(1< 0) printf(" ");
        printf("%d",c[i]);
    }printf("\n");
}
int main()
{
    int T;cin>>T;
    while(T--){
        init();sol();
    }
}

1006:string matching

会扩展KMP你就可以秒杀这道题。

你可能感兴趣的:(2019暑假补题)