zoukankan      html  css  js  c++  java
  • 【做题记录】CF194B Square

    Problem

    CF194B Square

    Solution

    这是一道比较有趣的数学题。
    我们设结果为 (x+1),为什么 (+1) 呢?为的是后面好计算。这里加的 (1) 是最开始放的那个。
    容易看出题意就是从 (0) 开始,每次加 (n+1) 再对 (4n) 取模,直到变成 (0) 为止。问这样的操作要几次。于是可以列出下面这个方程:

    [x(n+1) equiv 0 pmod{4n} ]

    [xn+x equiv 0 pmod{4n} ]

    到这里好像没有头绪了……
    可以想到结果应该是和 (4) 有关的,于是我们可以分类讨论下。

    (由于题目要求,算出来的都是最小正整数解,所以下面直接用 (=) 了QAQ)

    (n equiv 0 pmod 4) 时,显然

    [xn equiv 0 pmod{4n} ]

    所以 (x equiv 0 pmod{4n}),容易得到

    [x=4n ]

    (n equiv 1 pmod 4) 时,可以像上面那样算出 (x+x equiv 0 pmod{4n}),所以又可以得到

    [2x=4n ]

    [x=2n ]

    (n equiv 2 pmod 4) 时,又可以得到 (2x+x equiv 0 pmod{4n}),此时可以得到

    [x=frac{4}{3}kn ]

    显然题目要让 (k) 尽量小且结果为正整数,所以 (k=3),于是就能得到

    [x=4n ]

    (n equiv 3 pmod 4) 时,可以得到

    [3x+x equiv 0 pmod{4n} ]

    [x equiv 0 pmod n ]

    [x=n ]

    整理一下就是:

    • (n mod 4=0)时,(ans=4n+1)
    • (n mod 4=1)时,(ans=2n+1)
    • (n mod 4=2)时,(ans=4n+1)
    • (n mod 4=3)时,(ans=n+1)

    (ans) 表示题目要求的答案。

    code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    long long T,n;
    int main()
    {
    	scanf("%lld",&T);
    	while(T--)
    	{
    		scanf("%lld",&n);
    		switch(n%4)
    		{
    			case 0:printf("%lld
    ",4*n+1);break;
    			case 1:printf("%lld
    ",2*n+1);break;
    			case 2:printf("%lld
    ",4*n+1);break;
    			case 3:printf("%lld
    ",n+1);break;
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    Java 实现线程安全的三种方式
    tomcat启动时报EOFException错误的解决方式
    mysql优化——show processlist命令详解
    mysql数据库的锁有多少种,怎么编写加锁的sql语句
    java中的int与byte的转化
    JDK配置环境变量
    Eclipse32位官网下载地址
    js正则表达式匹配
    身份证号校验方法
    使用反射将JavaBean转为Map
  • 原文地址:https://www.cnblogs.com/mk-oi/p/14032947.html
Copyright © 2011-2022 走看看