专题训练之数论

一、数论是什么

官方解释(百度百科):数论是纯粹数学的分支之一,主要研究整数的性质。整数可以是方程式的解(丢番图方程)。有些解析函数(像黎曼ζ函数)中包括了一些整数、质数的性质,透过这些函数也可以了解一些数论的问题。链接

本菜菜理解:就是学习一些数之间的关系,把原来繁重的代码任务(巨大的复杂度),转换为用巧妙的数学方式,轻易地解出。

一句话解释:知道那些数论结论就很简单

二、数论包含哪些

我所学的数论知识比较微薄,举几个用过的

1.gcd(辗转相除法)

long long gcd(long long a,long long b)
{
    if (b==0)
        return a;
    else return gcd(b,a%b);
}

变型:求a,b最小公倍数
解:a*b/gcd(a,b)

2.exgcd

gcd的延伸,用于求ax+by=c的x,y解。

void exgcd(int a, int b, int &x, int &y)
{
    if(a%b==0)
    {
        x=0; y=1;
        return;
    }
    exgcd(b,a%b,x,y);
    t=x;   x=y;
    y=t-a/b*y;
}

3.快速幂

用于快速求出n的k次方(可用于求逆元)

    int n,k;
    long long sum=1,m;
    cin>>n>>k;
    m=n;
    while (k!=0)
    {
      if (k&1==1)
            sum*=m;
      k=k>>1;
      m*=m;
    }
    cout<<sum;

当然还有很多,写不完了…

三、本专题题解

1.k-rounding

题目链接

思路:求n和10的k次方的最小公倍数

#include <iostream>

using namespace std;

long long gcd(long long a,long long b)
{
    if (b==0)
        return a;
    else return gcd(b,a%b);
}
int main()
{
    long long n,k,k1=1;
    int i;
    cin>>n>>k;
    for (i=0;i<k;i++)
        k1*=10;
    cout<<n*k1/gcd(n,k1)<<endl;
    return 0;
}

2. Fedya and Maths

题目链接

思路:通过列举可以发现规律,如n的最后两位(n小于10则为n)为4的倍数,则答案为4,否则为0.

#include <iostream>
#include <string>
using namespace std;

int main()
{
    string s;
    cin>>s;
    int x,l=s.length();
    if (l==1)
        x=s[0]-'0';
    else
        x=s[l-1]-'0'+(s[l-2]-'0')*10;
    if (x%4==0) cout<<4<<endl;
    else cout<<0<<endl;
    return 0;
}

3.Revenge of GCD

题目链接

题意:求x和y的第k大公因数

思路:先求出x和y的最大公因数,x和y的公因数都是它的因数,再通过列举,求出第k大的因数。

#include <iostream>
#include <algorithm>
#define ll long long

using namespace std;

ll gcd(ll a,ll b)
{
    if (b==0)
        return a;
    else
        return gcd(b,a%b);
}
int main()
{
    int t;
    cin>>t;
    while (t--)
    {
        ll x,y,k;
        cin>>x>>y>>k;
        ll z=gcd(x,y);
        ll i,kk=0;
        ll ans[10010]={};
        for(i=1;i*i<=z;i++)
        {
            if(z%i==0)
            {
                ans[kk++]=i;
                if(i*i!=z)
                    ans[kk++]=z/i;
            }
        }
        if(kk<k)
            cout<<-1<<endl;
        else
        {
            sort(ans, ans+kk);
            cout<<ans[kk-k]<<endl;
        }
    }

return 0;
}

四、总结

数论这部分的题,如果你掌握了该题所包含的数论知识,或者找到其中的规律,就很好解出。因此想要把数论题做好,就要多练。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于题目没有具体说明是哪个作业的练习题,因此无法提供准确的答案。数论是关于整数性质与结构的研究,涉及到整数的基本性质,因此答案需要根据具体的题目来给出。以下是一些数论导引练习题的一般解答方法: 1. 证明素数无穷多个: 答案:假设素数只有有限个,标记为p1, p2, ..., pn。然后构造一个新的数q,q = p1p2...pn +1。由于1不是素数,所以q一定是一个素数。这样我们得到了比已知的所有素数都大的素数q,与假设矛盾,因此素数无穷多个。 2.证明方程x^2 + y^2 = z^2 在正整数解中有无穷多个: 答案:首先,我们可以构造一个简单的解(x,y,z) = (3,4,5)。然后考虑将这个解乘以一个正整数k得到新的解(x',y',z')=(3k,4k,5k)。由于k是任意的正整数,所以可以构造出无穷多个解。因此,方程在正整数解中有无穷多个。 3.证明质数的乘积加一不是素数: 答案:假设质数的乘积加一是一个素数,标记为p。然后考虑将p减去1,得到p-1。根据欧拉定理,如果p是一个质数,那么p-1一定能被p的某一个质因数整除。但由于p-1是p的倍数,所以p也能整除p-1,这与p是一个素数矛盾。因此,质数的乘积加一不是素数。 总之,数论是一个广泛而深入的领域,需要具体问题具体分析,根据题目中给出的具体条件进行推导和证明。以上是一些常见的解答方法,但无法确定具体的题目,所以答案可能不是完整的或不适用于特定的练习题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值