zoukankan      html  css  js  c++  java
  • 【数学-思维-枚举方式】ARC060B 桁和/Digit Sum

    题目链接

    题目解析

    这道题数学色彩比较浓厚,正解做法是我妹有想到的qwq

    但是这道题其实也并没有用到什么高明的技巧和想法,只是优化了枚举而已,就很巧妙。

    对于小于等于(sqrt n)(b),可以直接枚举判断,复杂度可以接受。

    而如果(b)大于了(sqrt n),那就说明(n)可以表示成(n=kb+r)的形式(最多只会有(2)位数,(b^2>n)

    (s=k+r)

    两式相减可得:(n-s=(b-1)k)

    所以(b-1)(n-s)的因数,那么用(sqrt{n-s})的时间就可以枚举(b)了,还是直接判断是否满足条件。

    注意一下这种情况(check)时不要忘了判断(b>sqrt n),也就是代码里的(n/x>=x)就不成立


    ►Code View

    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    #include<string>
    #include<map>
    #include<cmath>
    using namespace std;
    #define N 100005
    #define MOD 1000000007
    #define INF 100000000000
    #define LL long long
    LL rd()
    {
    	LL x=0,f=1;char c=getchar();
    	while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
    	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48); c=getchar();}
    	return f*x;
    }
    LL n,s,b=INF;
    bool check(LL x)
    {
    	if(n/x>=x) return 0;//有了更高次方的项
    	if(x==1) return 0;
    	LL k=n/x,r=n%x;
    	if(s==k+r) return 1;
    	return 0; 
    }
    LL change(LL x,LL y)
    {
    	LL res=0;
    	while(x)
    	{
    		res=res+(x%y);
    		x/=y;
    	}
    	return res;
    }
    int main()
    {
    	n=rd(),s=rd();
    	if(n==s) b=n+1;
    	LL m=n-s;
    	for(LL t=1;t*t<=m;t++)
    		if(m%t==0)
    		{
    			LL x=t+1,y=m/t+1;
    			if(check(x)) b=min(b,x);
    			if(check(y)) b=min(b,y);
    		}
    	for(LL t=2;t<=1000000;t++)
    	{
    		if(change(n,t)==s)
    		{
    			b=min(b,t);
    			break;
    		}
    	}
    	if(b==INF) b=-1;
    	printf("%lld
    ",b);
        return 0;
    }
    
    
  • 相关阅读:
    Tomcat起不来的原因
    Memcache和memcached
    charles
    chrome 和 chromeDriver
    解决Establishing SSL connection without server‘s identity verification is not recommended.
    Shiro的认证与授权
    详解 TCP的三次握手四次挥手
    计算机网络-第三章-数据链路层笔记总结
    阿里云高校计划续用考试凉凉
    用管程解决生产者消费者问题
  • 原文地址:https://www.cnblogs.com/lyttt/p/13915170.html
Copyright © 2011-2022 走看看