zoukankan      html  css  js  c++  java
  • 【数论】密码

    题目描述

    有一个密码箱,0到n-1中的某些整数是它的密码。且满足:如果a和b都是它的密码,那么(a+b)%n也是它的密码(a,b可以相等,%表示整除取余数),某人试了k次密码,前k-1次都失败了,最后一次成功了。
    问:该密码箱最多有多少不同的密码。

    输入

    第一行两个整数分别表示n,k(1≤k≤250000,k≤n≤1014)。第二行为k个用空格隔开的非负整数,表示每次试的密码。数据保证存在合法解。

    输出

    输出一行一个数,表示结果。

    样例输入

    复制样例数据

    42 5
    28 31 10 38 24
    

    样例输出

    14
    
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    typedef long long ll;
    ll cnt;
    const int N = 250006;
    ll a[N];
    ll gcd(ll a,ll b){
        if(a==0) return b;
        return gcd(b%a,a);
    }
    bool check(ll n){
        ll i;
        for(i=1;i<=cnt;i++){
            if(a[i]%n==0) return false;
        }
        return true;
    }
    int main()
    {
        ll n,k,i;
        cin>>n>>k;
        for(i=1;i<=k;i++){
            scanf("%lld",&a[i]);
            a[i]=gcd(n,a[i]);
        }
        sort(a+1,a+k);
        for(i=1;i<k;i++){
            if(a[i]!=a[i-1]){
                cnt++;
                a[cnt]=a[i];
            }
        }
        ll x=sqrt(a[k]);
        ll ans=n;
        for(i=1;i<=x;i++){
            if(a[k]%i==0){
                if(check(i)){
                    ans=n/i;
                    break;
                }
                else if(check(a[k]/i)){
                    ans=n/a[k]*i;
                }
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    获取网站IP地址(Linux,C)
    linux_c_udp_example
    linux_c_tcp_example
    golang-sort
    docker_jenkins
    依赖抽象,而不要依赖具体实现
    网络杂记
    游戏开发中遇到的问题
    随手杂记
    go多态
  • 原文地址:https://www.cnblogs.com/skyleafcoder/p/12319513.html
Copyright © 2011-2022 走看看