UVAlive 4119 (数学)

原创 2015年11月18日 23:39:49

白书123页的例题,如果不看书上的证明自己写真是写不出来,好厉害~

#include <bits/stdc++.h>
using namespace std;
#define maxn 111

char P[111111];
int xishu[maxn]; //每一个指数下的系数
long long mod;

void deal () {
    int l = strlen (P);
    memset (xishu, 0, sizeof xishu);
    for (int i = 1; P[i] != ')'; ) {
        int cur = 0; // 系数
        int flag = 1; //是否是负数
        while (P[i] != 'n' && P[i] != ')') {
            char ch = P[i];
            if (ch == '+') {}
            else if (ch == '-') {
                flag = 0;
            }
            else {
                cur = cur*10 + (ch-'0');
            }
            i++;
        }
        if (cur == 0)
            cur = 1;
        if (!flag)
            cur *= (-1);
        i++;

        int zhishu = 0; //指数
        if (P[i] == '/') {
            zhishu = 0;
            xishu[zhishu] = cur;
            break;
        }
        else if (P[i] != '^') {
            zhishu = 1;
        }
        else if (P[i] == '^') {
            i++;
            while (isdigit (P[i])) {
                zhishu = zhishu*10 + (P[i]-'0');
                i++;
            }
        }
        xishu[zhishu] = cur;
    }
    mod = 0;
    for (int i = 0; i < l; i++) {
        if (P[i] == '/') {
            i++;
            for (; i < l; i++) {
                mod = mod*10 + (P[i]-'0');
            }
            return ;
        }
    }
    return ;
}

long long qpow (long long a, int b) {
    if (b == 0)
        return 1;
    long long ans = qpow (a, b>>1);
    ans = ans*ans%mod;
    if (b&1)
        ans = ans*a%mod;
    return ans;
}

long long cal (long long num) {
    if (num == 0)
        return xishu[0];
    long long ans = 0;
    for (int i = 0; i <= 100; i++) {
        if (xishu[i]) {
            ans += xishu[i]*qpow (num, i)%mod;
        }
    }
    return ans;
}

int main () {
    //freopen ("in", "r", stdin);
    int kase = 0;
    while (scanf ("%s", &P) == 1) {
        if (P[0] == '.')
            break;
        deal (); //分解出来每一项的系数
        bool ok = 1;
        for (long long k = 0; k <= 101; k++) {
            long long num = cal (k); //n用k代替
            if (num%mod != 0) {
                ok = 0;
                break;
            }
        }
        printf ("Case %d: ", ++kase);
        if (ok) {
            printf ("Always an integer\n");
        }
        else
            printf ("Not always an integer\n");
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

UVALive 4119 Always an integer(差分数列+模拟)

UVALive - 4119 Always an integer题意: 输入一个关于n的表达式,求该表达式对于任意整数变量n得到的值是否均为整数。 思路:根据差分数列的性质,令 n = 1 , 2...

UVALive 6926 Maximum Score(组合数学)

题意: 给出p
  • lwt36
  • lwt36
  • 2015年12月08日 04:09
  • 302

UVALive 6925 Volume of Revolution(数学题)

题意: 给定一个不超过5次的方程,由此产生一个旋转体,求其真实体积给定一个不超过5次的方程, 由此产生一个旋转体, 求其真实体积 与此同时给出一种估算方法,通过给定slices横曲线和sta...
  • lwt36
  • lwt36
  • 2015年12月10日 00:01
  • 355

UVALive 6582 Magical GCD (数学+数据结构) -- 解题报告

Also available: UVALive 6582, UVA 1642, Gym 100299C题意给定一个序列,定义一个连续子序列的 Magical GCD 为子序列内所有元素的 GCD 乘上...

UVALive 7267(数学暴力)

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&...

UVALive 3490 (LA 3940) || ZOJ 2619 Generator AC自动机(或KMP) + 整数高斯消元 + 数学期望

题目大意: 就是现在一个字符串生成器每次随机扔出前n(n 将产生的字符连接起来成为其生成的字符串,如果它产生的字符串中有连续的一段出现了给定的禁止串,则生成停止 求停止时已经生成的字符串长度的期望 ...

UVALive 6844 Combination(组合数学)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=79610 题意:求for(int i = low ; i 题解...

UVALive - 3490 Generator 【数学】【高斯消元】

We can generate a random string by generating a sequence of random characters and concatenating them...

UVALive 5070 Awkward Lights 数学 高斯消元

题意:按一个开关,会对自身和与自身曼哈顿距离为d格子中的电灯产生影响。(开始看成曼哈顿距离...
  • NMfloat
  • NMfloat
  • 2016年02月18日 13:26
  • 214

Yukari's Birthday(UVALive - 6076)枚举 数学

一、大体题意: 蛋糕上放蜡烛。中心最多放1个蜡烛,然后,给出r和k,第 i 圈放k的i次方个蜡烛( k ≥ 2, 1 ≤ i  ≤ r.) 小技巧: 关于pow :pow(27,1.0 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVAlive 4119 (数学)
举报原因:
原因补充:

(最多只允许输入30个字)