1 条题解

  • 0
    @ 2025-8-24 22:05:39

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar dingcx
    不如回头再看一眼题面

    搬运于2025-08-24 22:05:39,当前版本为作者最后更新于2020-02-26 15:41:08,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    这道题不暴力也是可以过的呢

    思路

    毕竟是红题,所以怎么做都行。不过我在这里写一个 O(1)O(1) 的做法,以解决更大的 nnxx 的问题。

    容易发现,那个 5252 周在一开始就可以除掉了,反正这 5252 周是完全一样的。

    再来看每一周。把每天的数加起来,得到 7x+21k7x+21k,化简得 7(x+3k)7(x+3k),于是 77 也可以开始除掉。

    所以,只要在开始把 52×7=36452\times 7=364 除掉,那么方程就变为:x+3k=nx+3k=n

    解这个不定方程时,也需要关注一些题目的条件。这道题的条件有:1x1001≤x≤100xxkk 为正整数,且使得 xx 最大,kk 最小。

    显然,如果没有第一个条件,k=1k=1就是解,此时 x=n3x=n-3

    但是,当 n>103n>103 时,xx 取不到 n3n-3,就需要变小,而 kk 就要变大。kk 每变大 11xx 就要 3-3,直到 x100x≤100 为止。

    由此,可以分情况讨论。如果 nn33 的倍数,由 x=n3kx=n-3kxx33 的倍数,最大为 9999。同理,nn3311xx 也模 3311,最大为 x=100x=100nn3322 则最大为 x=98x=98kk 也就是 (nx)/3(n-x)/3

    综上所述,先看是否 n103n≤103,如果是则直接输出,否则按照 nn%33 讨论即可。

    代码

    毕竟是红题,没什么细节,直接上代码——

    我知道你们只看这里

    #include<cstdio>
    using namespace std;
    int read(){//没什么用的快读
    	int 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*10+c-'0';
    		c=getchar();
    	}
    	return x*f;
    }
    int main(){//主函数
    	int n=read()/364;//读入,开始直接/364
    	if(n<=103) printf("%d\n%d\n",n-3,1);//k可以取到1的情况
    	else{//k不能取1
    		if(n%3==0) printf("%d\n%d\n",99,(n-99)/3);//分类讨论,直接输出
    		if(n%3==1) printf("%d\n%d\n",100,(n-100)/3);
    		if(n%3==2) printf("%d\n%d\n",98,(n-98)/3);
    	}
    	return 0;//华丽结束
    }
    

    看我写了这么多推导过程,点个赞再走呗~

    • 1

    信息

    ID
    3757
    时间
    1000ms
    内存
    63MiB
    难度
    1
    标签
    递交数
    0
    已通过
    0
    上传者