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 divisors of A^B. Determine S modulo 9901 (the rest of the division of S by 9901).

Input
The only line contains the two natural numbers A and B, (0 <= A,B <= 50000000)separated by blanks.

Output
The only line of the output will contain S modulo 9901.

Sample Input

2 3

Sample Output

15

Hint
2^3 = 8.
The natural divisors of 8 are: 1,2,4,8. Their sum is 15.
15 modulo 9901 is 15 (that should be output). 

代码:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
typedef long long ll;
const int MAX_N = 10000;
const int MOD = 9901;

ll fpow(ll a, ll p) {
    ll ans = 1;
    while (p) {
        if (p&1) ans = (ans*a) % MOD;
        a = (a*a) % MOD;
        p >>= 1;
    }
    return ans;
}

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;
        }
    }
}

ll m;
ll p[100], c[100];
ll getFactors(ll x)
{
    m = 0;
    for (int i = 1; prime[i] <= x/prime[i]; i++) {
        if (x%prime[i] == 0) {
            p[m] = prime[i];
            c[m] = 0;
            while (x%prime[i] == 0) {
                c[m]++;
                x /= prime[i];
            }
            m++;
        }
    }
    if (x > 1) {
        p[m] = x;
        c[m] = 1;
        m++;
    }
    return m;
}

int main()
{
    getPrime();
    ll A, B;
    cin >> A >> B;
    getFactors(A);
    ll ans = 1;
    for (int i = 0; i < m; i++) {
        if (p[i] % MOD == 1) {
            ans = (B*c[i]+1)%MOD * ans % MOD;
            continue;
        }
        ll a = (fpow(p[i], B*c[i]+1)-1+MOD) % MOD;
        ll b = fpow(p[i]-1, MOD-2);
        ans = ans * a % MOD * b % MOD;
    }
    cout << ans << endl;
    return 0;
}

POJ3696 The Luckiest Number (数论:欧拉定理+数论基本操作)

题目:

The Luckiest number
Time Limit: 1000MS        Memory Limit: 65536K
Total Submissions: 6829        Accepted: 1820

Description

Chinese people think of ‘8‘ as the lucky digit. Bob also likes digit ‘8‘. Moreover, Bob has his own lucky number L. Now he wants to construct his luckiest number which is the minimum among all positive integers that are a multiple of L and consist of only digit ‘8‘.

Input

The input consists of multiple test cases. Each test case contains exactly one line containing L(1 ≤ L ≤ 2,000,000,000).

The last test case is followed by a line containing a zero.

Output

For each test case, print a line containing the test case number( beginning with 1) followed by a integer which is the length of Bob‘s luckiest number. If Bob can‘t construct his luckiest number, print a zero.

Sample Input

8
11
16
0

Sample Output

Case 1: 1
Case 2: 2
Case 3: 0

代码:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;
typedef long long ll;
const int MAX_N = 10000;
const int MOD = 9901;

ll fpow(ll a, ll p) {
    ll ans = 1;
    while (p) {
        if (p&1) ans = (ans*a) % MOD;
        a = (a*a) % MOD;
        p >>= 1;
    }
    return ans;
}

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;
        }
    }
}

ll m;
ll p[100], c[100];
ll getFactors(ll x)
{
    m = 0;
    for (int i = 1; prime[i] <= x/prime[i]; i++) {
        if (x%prime[i] == 0) {
            p[m] = prime[i];
            c[m] = 0;
            while (x%prime[i] == 0) {
                c[m]++;
                x /= prime[i];
            }
            m++;
        }
    }
    if (x > 1) {
        p[m] = x;
        c[m] = 1;
        m++;
    }
    return m;
}

int main()
{
    getPrime();
    ll A, B;
    cin >> A >> B;
    getFactors(A);
    ll ans = 1;
    for (int i = 0; i < m; i++) {
        if (p[i] % MOD == 1) {
            ans = (B*c[i]+1)%MOD * ans % MOD;
            continue;
        }
        ll a = (fpow(p[i], B*c[i]+1)-1+MOD) % MOD;
        ll b = fpow(p[i]-1, MOD-2);
        ans = ans * a % MOD * b % MOD;
    }
    cout << ans << endl;
    return 0;
}

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

时间: 2024-10-09 14:11:18

2018.11.6刷题记录的相关文章

2018.11.1刷题记录

最近在学新知识,都是例题,比较关键的单独拎出来,其他的就扔代码了. P1072 Hankson 的趣味题 (数论) 题目: 题目描述 Hanks 博士是 BT(Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson.现在,刚刚放学回家的 Hankson 正在思考一个有趣的问题. 今天在课堂上,老师讲解了如何求两个正整数c1 c_1c1? 和 c2c_2c2? 的最大公约数和最小公倍数.现在 Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个"求公约数"

[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个字符想完成后面复杂的操作肯定