IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Codeforces Round #777 (Div. 2) D. Madoka and the Best School in Russia -> 正文阅读

[数据结构与算法]Codeforces Round #777 (Div. 2) D. Madoka and the Best School in Russia

课上看的题然后看错了,一直以为是要把x分成两个bea的数的乘积

prob. :

def 一个数good则 它是d的倍数, 一个数bea则 它good 同时 它不能表示成2个good的数的乘积,给一个good的数x ,问这个数能否表示成两个不同的bea的数的集合的乘积

ideas :

两种做法

一个数num如果是bea的,则$d ,| ,num $且 d 2 ? ∣? ? n u m d^2 \,\not| \,num d2?num, 即 n u m = d × k num = d \times k num=d×k

分类讨论

x = d a × b x = d^a \times b x=da×b

  1. ) a = 1 a = 1 a=1, no

  2. ) a =? 1 a \not = 1 a?=1 , b 是合数,yes

  3. ) a =? 1 a \not = 1 a?=1 , b 是质数(包括1),d是质数,no

  4. ) a = 2 a = 2 a=2 , b 是质数,no

  5. ) a =? 2 a \not = 2 a?=2 , b 是质数,d是合数同时不是某个质数的幂次(可以把不同的质因数分开分配),yes

  6. ) a =? 1 a \not = 1 a?=1 , b 是质数,d是合数同时是某个质数的幂次, d = p 2 d = p ^ 2 d=p2 x = p 7 x = p ^ 7 x=p7 则no,否则yes

    浅证:设$d = p^k , 如 果 , 如果 ,a > 2 $ 且 k > 1 k > 1 k>1, 可以将一个k拆成1和k-1两部分分给另外的数中的两个 : p 2 k ? 1 , p k + 1 , p k , … , p k p ^{2k - 1}, p^{k + 1}, p^{k}, \dots, p^{k} p2k?1,pk+1,pk,,pk

    d = p 2 d = p ^ 2 d=p2 x = p 7 x = p ^ 7 x=p7 , 即 a= 3, k= 2, 因为幂次不能到4,( d 2 ? ∣? ? n u m d^2 \,\not| \,num d2?num),找不出两种分配方式

    另外总是能找出三个d作为基数,然后将剩下的再分配之后得到两种情况

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N = 1e5 + 10;
const int M = 1010;

ll primes[N], cnt = 0;
bool st[N];

void sieve() {
    cnt = 0;
    for (ll i = 2; i < N; ++i) {
        if (!st[i]) primes[++cnt] = i;
        for (ll j = 1; primes[j] * i < N; ++j) {
            st[primes[j] * i] = 1;
            if (i % primes[j] == 0) break;
        }
    }
}

bool isPrime(int x) {
    for (int i = 1; primes[i] <= x / primes[i]; ++i) {
        if (x % primes[i] == 0) return false;
    }
    return true;
}

vector<pair<int, int> > factor(int x) {
    vector<pair<int, int> > res;
    for (int i = 1; primes[i] <= x / primes[i]; ++i) {
        if (x % primes[i] == 0) {
            int cnt = 0;
            while (x % primes[i] == 0) {
                x /= primes[i];
                cnt++;
            }
            res.push_back({primes[i], cnt});
        }
    }
    if (x > 1) res.push_back({x, 1});
    return res;
}

signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

    sieve();

    int T;
    cin >> T;
    while (T--) {
        int x, d;
        cin >> x >> d;
        int a = 0;
        while (x % d == 0) {
            x /= d;
            a++;
        }
        if (a == 1) {
            cout << "NO" << endl;
            continue;
        }
        int b = x;
        if (!isPrime(b)) {
            cout << "YES" << endl;
            continue;
        }
        if (isPrime(d)) {
            cout << "NO" << endl;
            continue;
        }
        if(a == 2 && (isPrime(b) || b == 1)) {
            cout << "NO" << endl;
            continue;
        }
        vector<pair<int, int> > vec = factor(d);
        if (vec.size() > 1) {
            cout << "YES" << endl;
            continue;
        }
//        cerr << vec[0].second << " "<< a <<" "<< vec[0].first << " "<< b << endl;
        if (vec[0].second == 2 && a == 3 && vec[0].first == b) {
            cout << "NO" << endl;
            continue;
        }
        cout << "YES" << endl;
    }
    return 0;
}

DP

背包把方案算出来,把x表示成bea的数的乘积的方法有多少种

列出x的所有的因子

d p [ i ] [ j ] dp[i][j] dp[i][j] : 考虑了前i个数,当前的乘积是j的方案数,

转移 : d p [ i ] [ j ] = d p [ i ? 1 ] [ j ] + d p [ i ] [ j n u m i ] dp[i][j]= dp[i - 1][j] + dp[i][\frac{j}{num_i}] dp[i][j]=dp[i?1][j]+dp[i][numi?j?]

dp可以省掉一维,同时注意下标的处理,unordered_map 也会T

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const ll N = 1e5 + 10;

vector<ll> factor(ll x) {
    vector<ll> res;
    for (ll i = 1; i <= x / i; ++i) {
        if (x % i == 0) {
            res.push_back(i);
            if (i != x / i) res.push_back(x / i);
        }
    }
    sort(res.begin(), res.end());
    return res;
}

ll dp[N], xid[N], yid[N];
//unordered_map<ll, ll> mp;
ll x, d;

ll getNum(ll num) {
    if(num < N) return xid[num];
    return yid[x / num];
}

signed main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);

    ll T;
    cin >> T;
    while (T--) {
        cin >> x >> d;
        auto vec = factor(x);
        for (ll i = 0; i <= 2000; ++i) {
            dp[i] = 0;
        }
        for (ll i = 0; i < vec.size(); ++i) {
//            mp[vec[i]] = i;
            if(vec[i]< N) xid[vec[i]] = i;
            else yid[x / vec[i]] = i;
        }
        dp[0] = 1;
        for (ll i = 0; i < vec.size(); ++i) {
            if (vec[i] % d == 0 && (vec[i] / d) % d != 0) {
                for (ll j = 0; j < vec.size(); ++j) {
                    if(x /vec[i] % vec[j] != 0) continue;
                    ll num = vec[i] * vec[j];
                    dp[getNum(num)] = min(2ll, dp[getNum(num)] + dp[j]);
                }
            }
        }
        if (dp[vec.size() - 1] >= 2) cout << "YES" << endl;
        else cout << "NO" << endl;

    }
}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-15 22:50:27  更:2022-03-15 22:56:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/9 17:00:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码