zoukankan      html  css  js  c++  java
  • 例题2.8 总是整数 LA4119

    1.题目描写叙述:点击打开链接

    2.解题思路:本题利用差分序列的性质解决。将1,2,..,k+1都带入表达式计算,假设对全部的i。都有D整除P(i),那么该序列全部值都为整数,否则不都为整数。

    由于假设某一项不能整除。那么d^kP(i)就不是整数,因此不总是整数。

    只是本题的一个难点在于怎样解析表达式,能够发现。多项式的构成都符合an^k的形式。因此能够对第i项。找到它的系数a[i]和指数p[i],从而成功解析整个表达式。

    详细实现细节见代码。

    3.代码:

    //#pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<iostream>
    #include<algorithm>
    #include<cassert>
    #include<string>
    #include<sstream>
    #include<set>
    #include<bitset>
    #include<vector>
    #include<stack>
    #include<map>
    #include<queue>
    #include<deque>
    #include<cstdlib>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<ctime>
    #include<cctype>
    #include<functional>
    using namespace std;
    
    #define me(s)  memset(s,0,sizeof(s))
    #define rep(i,n) for(int i=0;i<(n);i++)
    typedef long long ll;
    typedef unsigned int uint;
    typedef unsigned long long ull;
    typedef pair <int, int> P;
    
    
    
    struct Polynomial
    {
        vector<int>a,p;
        void parse_polynomial(string expr)
        {
            int i=0,len=expr.length();
            while(i<len)
            {
                int sign=1;
                if(expr[i]=='+')i++;
                if(expr[i]=='-'){sign=-1;i++;}
                int v=0;
                while(i<len&&isdigit(expr[i]))v=v*10+expr[i++]-'0';//获得完整的系数
                if(i==len){a.push_back(v);p.push_back(0);}//常数项
                else
                {
                    assert(expr[i]=='n');
                    if(v==0)v=1; //假设第一项没有系数,那么当做1
                    v*=sign;
                    if(expr[++i]=='^')//有指数
                    {
                        a.push_back(v);
                        v=0;
                        i++;
                        while(i<len&&isdigit(expr[i]))v=v*10+expr[i++]-'0';
                        p.push_back(v);
                    }
                    else  //没有指数。默认指数是1
                    {
                        a.push_back(v);
                        p.push_back(1);
                    }
                }
            }
        }
    
        int mod(int x,int MOD)
        {
            int n=a.size();
            int ans=0;
            for(int i=0;i<n;i++)
            {
                int m=a[i];
                for(int j=0;j<p[i];j++)
                    m=(ll)m*x%MOD;  //注意:乘法可能会溢出
                ans=((ll)ans+m)%MOD;  //加法也可能会溢出
            }
            return ans;
        }
    };
    
    
    bool check(string expr)
    {
        int p=expr.find('/');
        Polynomial poly;
        poly.parse_polynomial(expr.substr(1,p-2));
        int D=atoi(expr.substr(p+1).c_str());
        for(int i=1;i<=poly.p[0]+1;i++)
            if(poly.mod(i,D)!=0)return false;
        return true;
    }
    
    
    int main()
    {
        int kase=1;
        string expr;
        while(cin>>expr)
        {
            if(expr[0]=='.')break;
            printf("Case %d: ",kase++);
            if(check(expr))puts("Always an integer");
            else puts("Not always an integer");
        }
    }
    

  • 相关阅读:
    elk
    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! 解决方法
    openssh 升级到8.2版本 (Linux 7)
    Linux 结合grep kill掉指定字符进程
    mysql 主从由于事务性挂断执行语句
    plsql 安装
    linux 7 本地化安装docker (阿里云版)
    docker 配置加速器
    Oracle 归档日志
    多线程事件
  • 原文地址:https://www.cnblogs.com/yxysuanfa/p/6999377.html
Copyright © 2011-2022 走看看