• LA 4119


    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2120

    假设式子的最高幂次为k 则只需要测试1到k+1就可以了

    原理见 刘汝佳的《算法竞赛入门经典入门指南》 P123

    字符串需要自己处理,比较繁琐 一定要细心

    代码:

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <queue>
    
    #define ll long long
    #define lint long long
    using namespace std;
    
    const int N=100005;
    ll a[N];
    ll powerMod(ll x,ll y,ll M)
    {//cout<<x<<" "<<y<<" "<<M<<endl;
        ll tmp=1;
        while(y)
        {
            if(y&1)
            tmp=tmp*x%M;
            x=x*x%M;
            y=y>>1;
        }
        //cout<<(tmp%M)<<endl;
        return tmp%M;
    }
    void func(string s)
    {//cout<<s<<endl;
        if(s.size()==0) return;
    
        int m=s.find('n');
        if(m==-1)
        m=s.size();
        int type=(s[0]=='-')?-1:1;
        ll tmp=0;
        //int l=;cout<<l<<" "<<m<<endl;
        for(int i=(s[0]=='+'||s[0]=='-')?1:0;i<m;++i)
        {//cout<<i<<" "<<tmp<<endl;
            tmp=tmp*10+s[i]-'0';
        }
        if(tmp==0) tmp=1;
        tmp=tmp*type;
        m=s.find('n');//cout<<m<<endl;
        if(m==-1) a[0]=tmp;
        else
        {//cout<<"in1"<<endl;return ;
            int k=s.find('^');
            if(k==-1)
            a[1]=tmp;
            else
            {//cout<<"in2"<<endl;
                int x=0;
                for(int i=k+1;i<s.size();++i)
                {
                    x=x*10+s[i]-'0';
                }
                //cout<<x<<" "<<tmp<<endl;
                a[x]=tmp;
            }
        }
        //cout<<"return"<<endl;
    }
    bool solve(string s)
    {
        memset(a,0,sizeof(a));
        int k=s.find('/');
        ll M=0;
        for(int i=k+1;i<s.length();++i)
        M=M*10+s[i]-'0';
        string stmp;
        for(int i=(s[0]=='(')?1:0;i<k&&s[i]!=')';++i)
        {
            if(s[i]=='+'||s[i]=='-')
            {
                func(stmp);
                stmp.clear();
            }
            stmp.push_back(s[i]);
        }
        func(stmp);
        for(ll i=1;i<=101;++i)
        {//cout<<i<<endl;
            ll tmp=0;
            for(ll j=0;j<=100;++j)
            {
                //cout<<j<<" "<<a[j]<<endl;
                tmp=(tmp+a[j]*powerMod(i,j,M))%M;
            }
            if(tmp!=0)
            return false;
        }
        return true;
    }
    int main()
    {
        //freopen("data.in","r",stdin);
        int ca=1;
        string s;
        while(cin>>s)
        {
            if(s==".")break;
            if(solve(s))
            printf("Case %d: Always an integer
    ",ca++);
            else
            printf("Case %d: Not always an integer
    ",ca++);
        }
        return 0;
    }
    
  • 相关阅读:
    GridView自定义分页
    intro
    ListView和DataPager初试
    在DataGrid中,如何录入数量及单价的时候自动算出金额
    常用正则表达式
    ASP.NET中基类页的设计和使用
    Asp.net实现无刷新检测用户名
    在asp.net2.0中使用存储过程
    .NET中的抽象工厂
    用C#生成随机中文汉字验证码的基本原理 [转]
  • 原文地址:https://www.cnblogs.com/liulangye/p/3177312.html
Copyright © 2020-2023  润新知