• 洛谷 题解 P2312 【解方程】


    Problem

    P2312 【解方程】 >>>

    record

    • 用时: 1166ms
    • 空间: 780KB(0.76MB)
    • 代码长度: 2.95KB
    • 提交记录: R9909587 >>>
    • 注: 使用了
      1. o1 优化
      2. o2 优化
      3. o3 优化
      4. 快读快输 >>>

    Solution

    30 pts

    枚举,使用 int,直接按题目所说暴力乱搞一通

    Unaccepted 30
    Ac:3
    Wa:7
    

    50 pts

    ∣a_i∣≤10^10000

    所以高精度。

    然而慢的一皮:

    Unaccepted 50
    Ac:5
    Tle:5
    

    评测记录 >>>

    30 pts

    考虑暴力优化。

    考虑在模意义下进行暴力,可以减小误差。

    注意:模的应该是质数,且应该多模数,防止误差。

    质数应该多记住几个,考场上的时候很有用(如:哈希)

    然后。。。就出锅了。

    评测记录 >>>

    Unaccepted 30
    Ac:3
    Wa:7
    

    100 pts

    请大家在NOIp上一定要:开 long long!

    评测记录 >>>

    Accepted 100
    Ac:10
    

    Code

    // luogu-judger-enable-o2
    /**
     * Problem:	P2312 解方程. 
     * Author:	航空信奥. 
     * Date:	2018/08/19. 
     * Upload:	Luogu. 
     */
    #pragma GCC optimize("O1")
    #pragma GCC optimize("O2")
    #pragma GCC optimize("O3")
    #include <stdio.h>
    #include <vector>
    using namespace std;
    
    namespace hkxadpall {
    
        char BufferRead[1 << 15];
        int rLen = 0, rPos = 0;
        inline char Getchar()
        {
            if (rPos == rLen) rPos = 0, rLen = fread(BufferRead, 1, 1 << 15, stdin);
            if (rPos == rLen) return EOF;
            return BufferRead[rPos++];
        } 
        
        template <typename _TpInt> inline _TpInt read();
        template <typename _TpInt> inline void write(_TpInt x);
        
    #	define Max_N 103
    #	define Mod1  10007LL
    #	define Mod2  19260817LL
    #	define Mod3  100000007LL
        
        int n, m;
        long long a1[Max_N];
        long long a2[Max_N];
        long long a3[Max_N];
        
        bool isRight(long long *a, int x, long long mod)
        {
            long long ans = a[n];
            for (int i = n - 1; i >= 0; i--) {
                ans = (ans * x + a[i]) % mod;
            }
            return (ans == 0);
        }
        
        int main() 
        {	
            n = read<int>();
            m = read<int>();
            
            for (int i = 0; i <= n; i++) {
            	bool flag = 0;
                char c = Getchar();
                while ((c > '9' || c < '0') && c != '-') 
                    c = Getchar();
                if (c == '-') flag = 1, c = Getchar();
                a1[i] = (c & 15);
                a2[i] = (c & 15);
                a3[i] = (c & 15);
                while ((c = Getchar()) <= '9' && c >= '0') {
                    a1[i] = ((a1[i] * 10) + (c & 15)) % Mod1;
                    a2[i] = ((a2[i] * 10) + (c & 15)) % Mod2;
                    a3[i] = ((a3[i] * 10) + (c & 15)) % Mod3;
                }
                if (flag) {
                	a1[i] = Mod1 - a1[i]; 
                	a2[i] = Mod2 - a2[i]; 
                	a3[i] = Mod3 - a3[i]; 
                }
            }
            
        	
        	vector <int> answer;
            for (int i = 1; i <= m; i++) {
                if (isRight(a1, i, Mod1)
                 && isRight(a2, i, Mod2)
                 && isRight(a3, i, Mod3)) 
                        answer.push_back(i);
            }
            
            printf("%d
    ", answer.size());
            for (int i = 0; i < answer.size(); i++)
            	write(answer[i]), putchar(10);
            
            return 0;
        }
    
        template <typename _TpInt>
        inline _TpInt read()       
        {
            register int flag = 1;
            register char c = Getchar();
            while ((c > '9' || c < '0') && c != '-') 
                c = Getchar();
            if (c == '-') flag = -1, c = Getchar();
            register _TpInt init = (c & 15);
            while ((c = Getchar()) <= '9' && c >= '0') 
                init = (init << 3) + (init << 1) + (c & 15);
            return init * flag;
        }
        
        template <typename _TpInt>
        inline void write(_TpInt x)
        {
            if (x < 0) {
                putchar('-');
                write<_TpInt>(~x + 1);
            }
            else {
                if (x > 9) write<_TpInt>(x / 10);   
                putchar(x % 10 + '0');
            }
        }
    }
    
    int main()
    {
        hkxadpall::main();
        return 0;
    }
    
  • 相关阅读:
    技术分享的一些好的建议
    项目经理排期的几个tip
    公司的目标和你的目标的关系
    Android实现双击事件的两种方式
    互联网公司团队建设的几个要点
    一对一还是一对多? MVP设计前提
    互联网产品研发的典型流程
    架构和模式的区别:三层架构和MVC在应用开发中的位置
    Android Studio插件:PlantUML
    Android Studio插件:GsonFromat
  • 原文地址:https://www.cnblogs.com/hkxadpall/p/9895943.html
Copyright © 2020-2023  润新知