【2019牛客暑期ACM集训多校第三场】

1.emmmm,牛客这场多校题目还是挺平和的,但是,由于队伍状态不是很好+玄学卡常所以没打好。

2.首先上来时字符串,这个之前写过最长的相等01串,子序列就是01出现的次数取个最小值的2倍。然后随便写写ac了。用的是dp写的,看了其他大佬把1看作1,0看作-1,然后计算前缀和也挺好的。

3.然后是H,由于整点,把点Hash一下。取个中间值即可。当时写了一个扫描线的写法,T了。。。。。。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll N1 = 10001;
const ll N2 = 2;
const int maxn = 1e4 + 10;
ll a[maxn];
const int N = 10100;
int main() {
     
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int n;
        scanf("%d", &n);
        for (int i = 0; i < n; i++)
        {
            int x, y;
            scanf("%d%d", &x, &y);
            a[i] = x * N1 + y * N2;
        }
        sort(a, a + n);
        int z = a[n / 2 - 1] + 1;
        int x0 = z % 2 ;
        int y0 = (z - N1 * x0) / 2;
        printf("%d %d %d %d\n", x0, y0, x0 - 2, y0 + N1);
    }
}

4.H和J就很秀了,队友各写一个,早就写好了,但是一直T.NlogN的写法T了,O(N)的写法也T了,他俩在疯狂的怀疑人生,平时用的都是cin关同步,然后改了一下scanf就AC了。也太秀了吧,卡了三个小时。

5.我把水题切完就去了D。其实我最开始看的就是D,因为我看了就知道这个题目怎么搞,之前做过,但是我觉得不是一个前期题,谁知道比我上次做的简单了不少。。。。。。就不再推了,把xxxxxx变成(x/9*pow(10,n)-1)是一个套路,初中数学的脑经急转弯题,如果这里都转化不了,这题估计大概率做不出来。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n, p, m, a[110], b[110], r, cnt;
ll calc(ll x)
{
    cnt = 0;
    int j = 2;
    while (j * j <= x)
    {
        if (x % j == 0)
        {
            ++cnt;
            a[cnt] = j;
            b[cnt] = 0;
            while (x % j == 0) ++b[cnt], x /= j;
        }
        j++;
    }
    if (x > 1) {
        ++cnt;
        a[cnt] = x; b[cnt] = 1;
    }
    return 0;
}
ll qmul(ll m, ll n, ll mod)
{
    ll ans = 0;
    while (n)
    {
        if (n & 1)
        {
            ans = ans + m;
            ans %= mod;
        }
        m = (m + m) % mod;
        n >>= 1;
    }
    return ans;
}
ll qpow(ll a, ll b, ll p)
{
    ll res = 1;
    while (b)
    {
        if (b & 1)
            res = qmul(res, a, p);
        a = qmul(a, a, p);
        res %= p;
        a %= p;
        b >>= 1;
    }
    return res;
}
ll qpow(ll a, ll b)
{
    ll res = 1;
    while (b)
    {
        if (b & 1)res = res * a;
        a = a * a;
        b >>= 1;
    }
    return res;
 }
ll solve(ll n, ll m, ll x) {
    calc(x);
    ll mx = 0, ans = 0;
    for (int i = 1; i <= cnt; i++) mx = max(mx, b[i]);
    for (int i = 1; i <= min(mx, m); i++)
    {
        ll res = 1;
        for (int j = 1; j <= cnt; j++)
        {
            int s = (b[j] + i - 1) / i;
            res = res *qpow(a[j], s);
        }
        ans += n / res;
    }
    if (m > mx)
    {
        ll ret = 1;
        for (int j = 1; j <= cnt; j++) ret = ret * a[j];
        ans += (m - mx) * (n / ret);
    }
    return ans;
}
ll gao(ll n)
{
    ll s = sqrt(n);
    vector<ll>v;
    for (ll i = 1; i <= s; i++)
    {
        if (n % i != 0)
            continue;
        v.push_back(n / i);
        if (qpow(10, i, 9 * p) == 1)
            return i;
    }
    for (ll i = v.size() - 1; i >= 0; i--)
    {
        if (qpow(10, v[i], 9 * p) == 1)
            return v[i];
    }
    return -1;
}
 
 
int main() {
    int T; cin >> T;
    while (T--)
    {
        cin >> p >> n >> m;
        if (p == 2 || p == 5)
        {
            puts("0");
            continue;
        }
        r = gao(6 * (p - 1));
        cout << solve(n, m, r) << endl;
    }
}

其他题目还没补,状态当时不好,可能是前天的HDU太菜了所致。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值