Uva 1069 Always an Integer ( 数学 )

Uva 1069 Always an Integer ( 数学 )

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cctype>
using namespace std;
typedef long long LL;
#define MAXN 105
#define CLR( a, b ) memset( a, b, sizeof(a) )
LL c[ MAXN ], d;
char str[ MAXN * MAXN ];

void init()
{
    CLR( c, 0 );
    LL k, a, key, sign = 1;
    d = k = a = key = 0;
    int len = strlen( str );
    for( int i = 0; i <= len; ++i )
    {
        if( isdigit( str[i] ) )
        {
            if( key == 0 )        a = a * 10 + str[i] - ‘0‘;
            else if( key == 1 ) k = k * 10 + str[i] - ‘0‘;
            else if( key == 2 ) d = d * 10 + str[i] - ‘0‘;
        }
        else if( str[i] == ‘/‘ )    key = 2;
        else if( str[i] == ‘n‘ )    key = 1;
        else if( str[i] == ‘-‘ || str[i] == ‘+‘ || str[i] == ‘)‘ )
        {
            if( key >= 1 )
            {
                if( k == 0 )    k = 1;
                if( a == 0 )    a = 1;
            }
            c[k] = a * sign;
            if( str[i] == ‘-‘ )    sign = -1;
            else sign = 1;

            key = a = k = 0;
        }
    }
}

LL fast_mod( LL a, int b, LL MOD )
{
    LL ans = 1;
    while( b )
    {
        if( b & 1 )    ans = ans * a % MOD;
        a = a * a % MOD;
        b >>= 1;
    }
    return ans;
}

bool judge()
{
    int n = MAXN - 1;
    while( c[n] == 0 ) n--;
    for( LL i = 1; i <= n + 1; ++i )
    {
        LL ans = 0;
        for( int j = 0; j <= n; ++j )
        {
            if( c[j] )
                ans = ( ans + c[j] * fast_mod( i, j, d ) ) % d;
            ans = ( ans + d ) % d;
        }
        if( ans )
            return false;
    }
    return true;
}

int main()
{
    int cas = 1;
    while(     ~scanf( "%s", str) && strcmp( ".", str ) != 0 )
    {
        init();
        printf( "Case %d: %s\n", cas++, judge() ? "Always an integer" : "Not always an integer" );
    }
    return 0;
}

代码君

时间: 2024-10-25 14:21:43

Uva 1069 Always an Integer ( 数学 )的相关文章

uva 1069 - Always an integer(数学+暴力)

题目链接:uva 1069 - Always an integer 题目大意:给出一个多次多项式,问说是否对于任意正整数n来说结构均为整数. 解题思路:首先处理出字符串,然后枚举n从1到k+1判断即可,k为多项式中出现过的最大幂数指. P为多项式,d为除数,k为多项式中最大的次数 当k=0时,P中不存在n变量,所以直接计算判断即可 当k=1时,P是一次多项式,那么P(n+1)?P(n)=a,a为常数,也就是说P(i)为等差数列,如果首项P(1)和公差P(2)-P(1)为d的倍数即可,等价与判断P

UVA 1069 - Always an integer(数论)

1069 - Always an integer 题意:给定一个多项式,推断是否总是整数 思路:LRJ大白上的例题,上面给出了证明,仅仅要1到k + 1(k为最高次数)带入方程都是整数,那么整个方程就是整数,处理出字符串后,然后过程用高速幂计算,推断最后答案是否为0,看是否全都满足是整数. 代码: #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; char s

UVA - 1069 Always an integer (模拟)

Description Combinatorics is a branch of mathematics chiefly concerned with counting discrete objects. For instance, how many ways can you pick two people out of a crowd ofn people? Into how many regions can you divide a circular disk by connectingn

uva 467 - Synching Signals(暴力+数学)

题目连接:uva 467 - Synching Signals 题目大意:有n个红绿灯,给出红灯的时间t,那么该灯从0时刻开始就以2*t为周期绿黄红三灯交替,时间分别为t-5,5,t.问所这n个等从第一变为有一个灯不为绿灯开始,要多久才能变成所有的灯刚好都为绿灯.时间超过1小时输出unable to synch after one hour. 解题思路:一小时才3600秒,枚举秒数判断即可. #include <cstdio> #include <cstring> #include

uva 618 - Doing Windows(暴力+数学)

题目链接:uva 618 - Doing Windows 题目大意:给出电脑桌面的大小W和H,现在在桌面上有4个窗口,给出窗口的初始大小,问说能不能通过调整各个窗口的大小(长宽比例不能变)使得4个屏幕刚好占满整个屏幕,并且互相不覆盖. 解题思路:其实可以直接暴力出所有情况,不过细节比较多,而且要考虑所有的细节. 我的做法的是先将4个窗口缩小至最小的状态,然后枚举左下角的窗口, 有四种可能 蓝色部分为另外枚举的窗口,3,4种情况要分别保证说长.宽相等,然后S部分就是子问题. 所以用一个二进制数来表

uva live 4123 Glenbow Museum 数学递推

// uva live 4123 Glenbow Museum 数学递推 // // 题目大意: // // 对于一个边平行于坐标轴的多边形,我们可以用一个序列来描述,R和O,R表示 // 该顶点的角度为90度,O表示该定点的角度为270.给定序列的长度.问能由这些RO序 // 列组成的星型多边形(内部存在一个点可以看到所有的节点的多边形)的方法数有多少. // // 解题思路: // // 顶点数一定是序列的长度.n小于4无法组成多边形.n为奇数的时候也不行.设R的个数有 // x个,O的个数

uva 11490 - Just Another Problem(数学)

题目链接:uva 11490 - Just Another Problem 题目大意:有n个士兵,要排列成一个方阵,要求方阵尽量大,于是在方正的中间会空出两个正方形的区域,空出来的局域要求厚度相同,即正方形的四条边向相应方向均再有x行或者列. 解题思路:根据题意可以知道x(6x+7r)=n,x为厚度,r为正方形的边长.接着枚举x,x是n的因子. #include <cstdio> #include <cstring> #include <cmath> typedef l

UVA 12723 Dudu, the Possum --数学期望

题意不说了,概率和期望值要分开处理,可以先算出到达每层的概率,然后再乘以每层的期望,每层的期望是固定的.也可以从后往前直接推期望. #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; #define N 100007 double ex[516]; double dp[

Uva 1315 - Creaz tea party ( 数学 + 规律 )

Uva 1315 - Creaz tea party (  数学 + 规律 ) 题意: 一个环,围在一个坐了N个人.每次操纵可以交换相邻的两个人的位置.求最少需要交换几次,可以变为逆序. 这里的逆序指的是原来在A左边的人在A的右边,在A右边的在A的左边. 分析: 如果是线性的,,,果断类似冒牌排序(n)(n-1)/2 但是这里是环,推了推但是推不出结果..结论是将环分为两段线性的序列,线性的满足上面的公式. 如:     1 2 3 4 5  线性:  5 4 3 2 1  ( 10次 ) 环状