国庆集训 || Wannafly Day4

链接:https://www.nowcoder.com/acm/contest/205#question

一场题面非常 有趣 但是题目非常 不友好的比赛

QAQ

L.数论之神   思维(?)

题意:求对给定的n,中有多少个不同的数,并且这些不同的数中第k大的是多少

思路:打表找了找规律(感觉自己天天都在找规律。。),对于不同的n,不同的结果中,≤sqrt(n)的一定都有,剩下的直接除就ok了

整数除法:https://blog.csdn.net/qq_39792342/article/details/82783100

艾玛说不明白话,还是适合直接找规律(哭

#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        LL n, k, sq, cnt;
        scanf("%lld%lld", &n, &k);
        sq = (LL)sqrt(double(n));
        if(n < sq*(sq+1)) cnt = sq+sq-1;
        else cnt = sq+sq;
        printf("%lld ", cnt);
        if(k <= cnt-sq) printf("%lld
", n/k);
        else printf("%lld
", cnt+1-k);
    }
}
View Code

G.贵族用户   暴力嘤嘤嘤

勾起了我一年前玩奇迹暖暖养女儿的回忆QAQ (女儿你还好吗~~

题意:花x元获得10x个钻石,ai个钻石可以使得原价为di的服装价格变为,要买ci件价格为di的衣服,问最少氪多少钱

思路:暴力枚举得到每一档的打折,求最少的钱数

注意1.可能不氪金反而更便宜

2.享受pi折扣的时候,要保证氪的钻石>=a[i],因此所需的钻石是max(钻石, a[i])

3.向上取整的时候可以,比如除以100然后向上取整 -> (x+99)/100

4.好坑啊好坑啊

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
int c[22], d[22], a[22], p[22];
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        int m, k;
        scanf("%d%d", &m, &k);
        for(int i = 0; i < m; i++)
            scanf("%d%d", &a[i], &p[i]);
        int sum = 0;
        for(int i = 0; i < k; i++)
            scanf("%d%d", &c[i], &d[i]), sum += c[i]*d[i];
        int ans = 1000000000, ans_novip = sum;
        for(int i = 0; i < m; i++)
        {
            int sum_vip = 0;
            for(int j = 0; j < k; j++)
                sum_vip += (d[j] * (100-p[i]) + 99) / 100 * c[j];
            sum_vip = min(max(sum_vip, a[i]), ans_novip);
            ans = min(ans, sum_vip);
        }
        printf("%d
", (ans+9)/10);
    }
    return 0;
}
View Code

B.电音之王   快速乘操作666

题意:已知a0,a1,m0,m1,c,定义an=m0an-1+m1an-2+c (n≥ 2)

,(保证

思路:直接暴力是O(10^8)的,又有模运算,so 优化叭

太高级了。。。64位模,板子收下了orz

#include <iostream>
#include <cstdio>
#include <cassert>
#include <cmath>
using i64 = long long;
using u64 = unsigned long long;
using u128 = __uint128_t;
struct Mod64
{
    Mod64() : n_(0) {}
    Mod64(u64 n) : n_(init(n)) {}
    static u64 modulus() { return mod; }
    static u64 init(u64 w) { return reduce(u128(w) * r2); }
    static void set_mod(u64 m)
    {
        mod = m;
        assert(mod & 1);
        inv = m;
        for (int i = 0; i < 5; ++i)
            inv *= 2 - inv * m;
        r2 = -u128(m) % m;
    }
    static u64 reduce(u128 x)
    {
        u64 y = u64(x >> 64) - u64((u128(u64(x) * inv) * mod) >> 64);
        return i64(y) < 0 ? y + mod : y;
    }
    Mod64 &operator+=(Mod64 rhs)
    {
        n_ += rhs.n_ - mod;
        if (i64(n_) < 0)
            n_ += mod;
        return *this;
    }
    Mod64 operator+(Mod64 rhs) const { return Mod64(*this) += rhs; }
    Mod64 &operator*=(Mod64 rhs)
    {
        n_ = reduce(u128(n_) * rhs.n_);
        return *this;
    }
    Mod64 operator*(Mod64 rhs) const { return Mod64(*this) *= rhs; }
    u64 get() const { return reduce(n_); }
    static u64 mod, inv, r2;
    u64 n_;
};
u64 Mod64::mod, Mod64::inv, Mod64::r2;

inline u64 mod128_64_small(u128 a, u64 b)
{
    u64 q, r;
    __asm__(
        "divq	%4"
        : "=a"(q), "=d"(r)
        : "0"(u64(a)), "1"(u64(a >> 64)), "rm"(b));
    return r;
}

u64 fact_mod_fast(int N, u64 mod)
{
    Mod64::set_mod(mod);
    Mod64 ret = Mod64(1), one = ret, t = one;
    for (int i = 1; i <= N; ++i)
    {
        ret *= t;
        t += one;
    }
    return ret.get();
}
int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        u64 a0_, a1_, m0_, m1_, c_, M, k;
        scanf("%llu%llu%llu%llu%llu%llu%llu", &a0_, &a1_, &m0_, &m1_, &c_, &M, &k);
        Mod64 :: set_mod(M);
        Mod64 a0 = Mod64(a0_);
        Mod64 a1 = Mod64(a1_);
        Mod64 m0 = Mod64(m0_);
        Mod64 m1 = Mod64(m1_);
        Mod64 c = Mod64(c_);
        Mod64 ans = a0*a1;
        Mod64 a2;
        for(int i = 2; i <= k; i++)
        {
            a2 = m0*a1+m1*a0+c;
            ans = ans * a2;
            a0 = a1;
            a1 = a2;
        }
        printf("%llu
", ans.get());
    }
}
View Code

快速乘的模板↓

LL multi(LL x,LL y,LL mod)
{
    LL tmp = (x * y - (LL)((long double) x / mod * y + 1.0e-8) * mod);
    return tmp < 0 ? tmp+mod : tmp;//x*y%mod
}
View Code
原文地址:https://www.cnblogs.com/pinkglightning/p/9746175.html