1 条题解
-
0
自动搬运
来自洛谷,原作者为

dingcx
不如回头再看一眼题面搬运于
2025-08-24 22:05:39,当前版本为作者最后更新于2020-02-26 15:41:08,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
这道题不暴力也是可以过的呢
思路
毕竟是红题,所以怎么做都行。不过我在这里写一个 的做法,以解决更大的 和 的问题。
容易发现,那个 周在一开始就可以除掉了,反正这 周是完全一样的。
再来看每一周。把每天的数加起来,得到 ,化简得 ,于是 也可以开始除掉。
所以,只要在开始把 除掉,那么方程就变为:。
解这个不定方程时,也需要关注一些题目的条件。这道题的条件有:, 和 为正整数,且使得 最大, 最小。
显然,如果没有第一个条件,就是解,此时 。
但是,当 时, 取不到 ,就需要变小,而 就要变大。 每变大 , 就要 ,直到 为止。
由此,可以分情况讨论。如果 是 的倍数,由 得 为 的倍数,最大为 。同理, 模 余 则 也模 余 ,最大为 , 模 余 则最大为 。 也就是 。
综上所述,先看是否 ,如果是则直接输出,否则按照 % 讨论即可。
代码
毕竟是红题,没什么细节,直接上代码——
(
我知道你们只看这里)#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
- 上传者