zoukankan      html  css  js  c++  java
  • 【NOIP模拟】Candy

    题面

    分析

    被吓到了,说实话,以为考的是我觉得不可能的高精度。。

    然而我真的数学好差,这种一眼结论都没看出来!!!70分可以随便拿啊!!

    70pts

    可以发现,最后的数字都每一位一定都是一样的。可以写成 ∑digit *111……111(1的个数为该数长度)

    比如233 -->888=(2+3+3)*111=8*111

    而最后求的是最小质因数,不妨就用前面这一部分来求质因数,比较佛系,但是能得70

    100pts

    后面这一部分其实也很好处理,就在快速幂的过程中求解

    考虑1111111...1=(10n-1)/9 (n表示有多少个1)
    那么问题就转化成了(10n-1)/9 %y==0,也就是10%(9*y)==1

    我们可以枚举这个y.因为和最大也就5e6,所以y最多也不会超过5e6,用线性筛预处理一下即可

    代码

    #include<bits/stdc++.h>
    using namespace std;
    #define N 5000500
    #define ll long long 
    ll a,len,cnt,ans,sum;
    char c[N];
    ll v[N],prime[N];
    ll ksm(ll a,ll b,ll mod)
    {
        ll ret=1;
        while(b)
        {
            if(b&1)ret=ret*a%mod;
            a=a*a%mod;
            b>>=1;
        }
        return ret;
    }
    
    void primes(ll n)
    {
        for(ll i=2;i<=n;i++)
        {
            if(!v[i])
            {
                prime[++cnt]=i;
                v[i]=i;
            }
            for(ll j=1;j<=cnt;j++)
            {
                if(prime[j]>v[i]||prime[j]*i>n)break;
                v[prime[j]*i]=prime[j];
            } 
        }
    }
    
    int main()
    {
        scanf("%s",c);
        len=strlen(c);
        for(ll i=0;i<len;i++)
            sum+=c[i]-'0';
        primes(5000100);
        for(ll i=1;i<=cnt;i++)
            if(sum%prime[i]==0||ksm(10,len,9*prime[i])==1)
            {    ans=prime[i];break;    }
        printf("%lld
    ",ans);    
        return 0;
    }
    “Make my parents proud,and impress the girl I like.”
  • 相关阅读:
    微软MSBI商业智能视频
    华为HG8245 电信 光猫破解获取超级密码
    Html5与CSS3权威指南 百度云下载
    GUI常用对象介绍3
    GUI常用对象介绍2
    GUI常用对象的属性
    AtCoder Beginner Contest 082 B
    AtCoder Beginner Contest 082 A
    回文字符串
    进制转换(大数)
  • 原文地址:https://www.cnblogs.com/NSD-email0820/p/9748206.html
Copyright © 2011-2022 走看看