2018.11.1刷题记录

最近在学新知识,都是例题,比较关键的单独拎出来,其他的就扔代码了。

P1072 Hankson 的趣味题 (数论)

题目:

题目描述

Hanks 博士是 BT(Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson。现在,刚刚放学回家的 Hankson 正在思考一个有趣的问题。

今天在课堂上,老师讲解了如何求两个正整数c1 c_1c1? 和 c2c_2c2? 的最大公约数和最小公倍数。现在 Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1 a_0,a_1,b_0,b_1a0?,a1?,b0?,b1?,设某未知正整数x xx 满足:

1. xxx 和 a0a_0a0? 的最大公约数是 a1a_1a1?;

2. xxx 和 b0b_0b0? 的最小公倍数是b1 b_1b1?。

Hankson 的“逆问题”就是求出满足条件的正整数xxx。但稍加思索之后,他发现这样的xxx 并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的 xxx 的个数。请你帮助他编程求解这个问题。
输入输出格式
输入格式:

第一行为一个正整数 nnn,表示有 nnn 组输入数据。接下来的n nn 行每行一组输入数据,为四个正整数 a0,a1,b0,b1a_0,a_1,b_0,b_1a0?,a1?,b0?,b1?,每两个整数之间用一个空格隔开。输入数据保证 a0a_0a0? 能被 a1a_1a1? 整除,b1b_1b1? 能被b0 b_0 b0?整除。

输出格式:

共 nn n行。每组输入数据的输出结果占一行,为一个整数。

对于每组数据:若不存在这样的 xxx,请输出 000;

若存在这样的x xx,请输出满足条件的x xx 的个数;

输入输出样例
输入样例#1: 复制

2
41 1 96 288
95 1 37 1776 

输出样例#1: 复制

6
2

说明

【说明】

第一组输入数据,xx x可以是 9,18,36,72,144,2889,18,36,72,144,2889,18,36,72,144,288,共有6 66 个。

第二组输入数据,xxx 可以是48,1776 48,177648,1776,共有 222 个。

【数据范围】

对于 50%的数据,保证有 1≤a0,a1,b0,b1≤100001≤a_0,a_1,b_0,b_1≤100001≤a0?,a1?,b0?,b1?≤10000 且n≤100 n≤100n≤100。

对于 100%的数据,保证有 1≤a0,a1,b0,b1≤2,000,000,0001≤a_0,a_1,b_0,b_1≤2,000,000,0001≤a0?,a1?,b0?,b1?≤2,000,000,000 且 n≤2000n≤2000n≤2000。

NOIP 2009 提高组 第二题

代码:

#include <bits/stdc++.h>

using namespace std;
const int MAX_N = 1e6 + 5;

int prime[MAX_N+1];
void getPrime() {
    memset(prime, 0, sizeof prime);
    for (int i = 2; i <= MAX_N; i++) {
        if (!prime[i]) prime[++prime[0]] = i;
        for (int j = 1; j <= prime[0] && j <= MAX_N/i; j++) {
            prime[i*j] = 1;
            if (i%j == 0) break;
        }
    }
}

inline bool work(int p, int&a, int& b, int& c, int& d, long long& ans) {
    int ma = 0, mb = 0, mc = 0, md = 0;
    while (a%p == 0)
        ma++, a /= p;
    while (b%p == 0)
        mb++, b /= p;
    while (c%p == 0)
        mc++, c /= p;
    while (d%p == 0)
        md++, d /= p;
    if (ma > mc && mb < md && mc == md)
        return true;
    else if (ma > mc && mb == md && mc <= md)
        return true;
    else if (ma == mc && mb < md && mc <= md)
        return true;
    else if (ma == mc && mb == md && mc <= md) {
        ans *= md-mc+1;
        return true;
    }
    else {
        ans = 0;
        return false;
    }
}

int main()
{
    getPrime();
    int N;
    cin >> N;
    while (N--) {
        int a, b, c, d;
        scanf("%d%d%d%d", &a, &c, &b, &d);
        int maxp = d;
        long long ans = 1;
        for (int i = 1; i <= prime[0] && prime[i]*prime[i] <= maxp; i++) {
            if (d%prime[i]) continue;
            if (!work(prime[i], a, b, c, d, ans))
                break;
        }
        if (d > 1)
            work(d, a, b, c, d, ans);
        cout << ans << endl;
    }
    return 0;
}
/*
1
7 1 7 7
*/

P1463 [POI2002][HAOI2007]反素数 (数论)

题目:

题目描述

对于任何正整数x,其约数的个数记作g(x)。例如g(1)=1、g(6)=4。

如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数。例如,整数1,2,4,6等都是反质数。

现在给定一个数N,你能求出不超过N的最大的反质数么?
输入输出格式
输入格式:

一个数N(1<=N<=2,000,000,000)。

输出格式:

不超过N的最大的反质数。

输入输出样例
输入样例#1: 复制

1000

输出样例#1: 复制

840

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define tomax(a, b) a = a>b?a:b
#define tomin(a, b) a = a<b?a:b
const int Prime[10] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29};

ll N;
ll ans, gans;
void dfs(ll sum, int gsum, int precnt, int i)
{
    if (i == 10 || sum * Prime[i] > N) {
        if (sum < N) {
            if (gans < gsum)
                gans = gsum, ans = sum;
            else if (gans == gsum)
                tomin(ans, sum);
        }
        return;
    }
    for (int j = 1; j <= precnt; j++) {
        sum *= Prime[i];
        if (sum > N)
            break;
        dfs(sum, gsum*(j+1), j, i+1);
    }
}

int main()
{
    cin >> N;
    dfs(1, 1, 30, 0);
    cout << ans << endl;
    cout << ans << ‘ ‘ << gans << endl;
    return 0;
}

P2261 [CQOI2007]余数求和 (数论)

题目:

题目背景

数学题,无背景
题目描述

给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod i表示k除以i的余数。例如G(10, 5)=5 mod 1 + 5 mod 2 + 5 mod 3 + 5 mod 4 + 5 mod 5 …… + 5 mod 10=0+1+2+1+0+5+5+5+5+5=29
输入输出格式
输入格式:

两个整数n k

输出格式:

答案

输入输出样例
输入样例#1: 复制

10 5

输出样例#1: 复制

29

说明

30%: n,k <= 1000

60%: n,k <= 10^6

100% n,k <= 10^9

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
#define min(a, b) a<b?a:b

ll N, k, ans;
int main()
{
    cin >> N >> k;
    ans = N*k;
    for (int x = 1, gx; x <= N; x = gx+1) {
        gx = k/x ? min(k/(k/x), N) : N;
        ans -= (k/x) * (x+gx) * (gx-x+1) / 2;
    }
    cout << ans << endl;
    return 0;
}

CH3101 阶乘分解 (数论)

题目:

描述

给定整数 N(1≤N≤10^6),试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 p_i 和 c_i 即可。
输入格式

一个整数N。
输出格式

N! 分解质因数后的结果,共若干行,每行一对pi, ci,表示含有pi^ci项。按照pi从小到大的顺序输出。
样例输入

5

样例输出

2 3
3 1
5 1

样例解释

5! = 120 = 2^3 * 3 * 5

代码:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAX_N = 1e6 + 5;

int prime[MAX_N+1];
void getPrime() {
    memset(prime, 0, sizeof prime);
    for (int i = 2; i < MAX_N; i++) {
        if (!prime[i]) prime[++prime[0]] = i;
        for (int j = 1; j <= prime[0] && prime[j] <= MAX_N/i; j++) {
            prime[prime[j]*i] = 1;
            if (i%prime[j] == 0) break;
        }
    }
}

int main()
{
    getPrime();
    int N;
    cin >> N;
    ll cnt;
    for (int i = 1; prime[i] <= N; i++) {
        cnt = 0;
        ll tmp = prime[i];
        while (tmp <= N) {
            cnt += N/tmp;
            tmp *= prime[i];
        }
        cout << prime[i] << ‘ ‘ << cnt << endl;
    }

    return 0;
}

原文地址:https://www.cnblogs.com/Lubixiaosi-Zhaocao/p/9896607.html

时间: 2024-12-13 22:36:22

2018.11.1刷题记录的相关文章

2018.11.6刷题记录

数论基本糙作: gcd,快速幂,逆元,欧拉函数,分解因数balabala一通乱搞. POJ1845 Sumdiv (数论:算数基本定理+数论基本操作) 题目: Sumdiv Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 29012 Accepted: 7127 Description Consider two natural numbers A and B. Let S be the sum of all natural d

[2015.6.28] OI刷题记录

FZSZOJ刷题记录: 1051 砝码称重: DP 多重背包 1058 liqeuer: 序列DP 1061 挖地雷:DP,注意需要倒过来做DP,同时记录路径. 1059 Number:DP 1054 数塔问题:同数字三角形,普通DP 1390 等式问题:爆搜,枚举每个+号或-号的位置 1006 中位数:维护大根堆+小根堆,每次插入调整 1005 Cube Stacking:并查集维护当前在第几个和当前集合的高度,并查集变种. 1073 DNA分子的最佳比对:序列DP 1110 奖学金:傻逼题,

首师大附中科创教育平台 我的刷题记录(7)

首师大附中科创教育平台我的刷题记录(这次给大家刷多一点,31--40题吧) 仅供同学们参考,禁止抄袭!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! #include<iostream> using namespace std; int main() { int n; cin>>n; if(n%4==0&&n%100!=0||n%400==0) cout<<"yes"<<endl; else cout&

leetcode刷题记录(2)

301. Remove Invalid Parentheses Remove the minimum number of invalid parentheses in order to make the input string valid. Return all possible results. Note: The input string may contain letters other than the parentheses ( and ). Examples: "()())()&q

暑期刷题记录

已经决定不玩空间了,在这里开一贴,用来记录暑假期间刷过的每一题. 时间从7.29号开始计算. 1. HDU 4883 TIANKENG’s restaurant    ( 贪心 ) 这个是bestcoder #2 的第一题,,居然想半天没有做出来,简直是太弱了,居然又在分情况讨论 题目大意:TIANKENG的饭店有客人陆续到达,如果再一批客人没有走的情况下,新来的客人就需要另外的座位,问最少需要多少座位. 题解: 贪心算法,首先对所有时间进行排序(时间相同以人数为第二关键字), 然后如果是到达,

Codeforces 刷题记录

Codeforces 每日刷题记录 打'+'是一些有启发意义的题目,部分附上一句话题解,每日更新3题,大部分题目较水. 1.+CF1073E:状压,数位dp,官方题解std骚操作 2.CF1072A 3.CF1072B 4.CF1072C 5.CF1068C:读题恶心 6.CF1073D:猜复杂度,模拟 7.CF1088A 8.CF1088B 9.CF1088C:构造思想 10.CF1066A 11.CF1066B 12.CF1066C 13.+CF1088E:推结论,tree dp,贪心 14

CSP-S集训刷题记录

$ CSP.S $ 集训刷题记录: $ By~wcwcwch $ 一.字符串专题: 1. [模板]$ manacher $ 算法 模型:求出字符串 $ S $ 中所有回文串的位置及长度. 个人理解:解决这类问题,回文串的对称性质最重要. 于复杂度最关键的一句话: $ f[i]=min~(~r-i~,~f[~mid\times2-i~]~)~ $ (实现不同,边界可能不一样) 这个 $ min $ 函数左边 $ r-i $ 是当前位置到它所属于的回文串边界的距离,右边 $ mid\times 2

LeeCode刷题记录

在博客园上开启LeeCode刷题记录,希望可以成为一只厉害的程序媛~ 类别:Python 题目(1) 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 示例:给定 nums = [2, 7, 11, 15]      target = 9    因为 nums[0] + nums[1] = 2 + 7 = 9      所以返回 [0, 1]

刷题记录:ctf473831530_2018_web_virink_web

目录 刷题记录:ctf473831530_2018_web_virink_web 知识点 限制字符数量写shell 内网探测 PHP-FPM未授权访问漏洞 rsync未授权访问漏洞 刷题记录:ctf473831530_2018_web_virink_web 题目复现链接:https://buuoj.cn/challenges 参考链接:BUUOJ刷题-Web-ctf473831530_2018_web_virink_web 知识点 限制字符数量写shell 仅用20个字符想完成后面复杂的操作肯定