uvalive 4119 Always an Interger

差分数列+字符串处理

题意:是让你判断一个整系数多项式的值是否一直都能被一个所给的正整数所整除。

通过对差分数列的不断求导,我们可以发现,对于任意多项式P,我们只需要判断n从1到k+1是否满足就行了,其中,k为多项式P中的最高次数。

可以先了解一下差分数列。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include<cstdlib>
  4 #include<cctype>
  5 #include<string>
  6 #include<vector>
  7 #include<cassert>
  8 using namespace std;
  9 struct Polynomial
 10 {
 11     vector<int >a,p;
 12     void parse_polynomial(string str)
 13     {
 14         int len=str.size(),i=0;
 15         while(i<len)
 16         {
 17             int sign=1;
 18             if(str[i]==‘+‘)
 19                 i++;
 20             if(str[i]==‘-‘)
 21             {
 22                 i++;
 23                 sign=-1;
 24             }
 25             int v=0;
 26             while(i<len&&isdigit(str[i]))
 27                 v=v*10+str[i++]-‘0‘;
 28             if(i==len)
 29             {
 30                 a.push_back(v);
 31                 p.push_back(0);
 32             }
 33             else
 34             {
 35                 assert(str[i] == ‘n‘);
 36                 if(v==0)
 37                     v=1;
 38                 v*=sign;
 39                 if(str[++i]==‘^‘)
 40                 {
 41                     a.push_back(v);
 42                     v=0;
 43                     i++;
 44                     while(i<len&&isdigit(str[i]))
 45                         v=v*10+str[i++]-‘0‘;
 46                     p.push_back(v);
 47                 }
 48                 else
 49                 {
 50                     a.push_back(v);
 51                     p.push_back(1);
 52                 }
 53             }
 54         }
 55     }
 56         int mod(int x,int MOD)
 57         {
 58             int n=a.size();
 59             int ans=0;
 60             for(int i=0; i<n; i++)
 61             {
 62                 int m=a[i];
 63                 for(int j=0; j<p[i]; j++)
 64                 {
 65                     m=(long long)m*x%MOD;
 66                 }
 67                 ans=((long long)ans + m) % MOD;
 68             }
 69             return ans;
 70         }
 71 };
 72
 73 bool check(string str)
 74 {
 75     int p=str.find(‘/‘);
 76     Polynomial poly;
 77     poly.parse_polynomial(str.substr(1, p-2));
 78     int D = atoi(str.substr(p+1).c_str());
 79     for(int i=1; i<=poly.p[0]+1;i++)
 80     {
 81         if(poly.mod(i,D))
 82             return false;
 83     }
 84     return true;
 85 }
 86
 87 int main()
 88 {
 89     int cas=1;
 90     string str;
 91     while(cin>>str)
 92     {
 93         if(str[0]==‘.‘)
 94             break;
 95         printf("Case %d: ", cas++);
 96             if(check(str))
 97                 printf("Always an integer\n");
 98             else
 99                 printf("Not always an integer\n");
100     }
101     return 0;
102 }

时间: 2024-10-14 05:29:58

uvalive 4119 Always an Interger的相关文章

UVALive 4848 Tour Belt

F - Tour Belt Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVALive 4848 Description Korea has many tourist attractions. One of them is an archipelago (Dadohae in Korean), a cluster of small islands sca

UVALive 6467 Strahler Order 拓扑排序

这题是今天下午BNU SUMMER TRAINING的C题 是队友给的解题思路,用拓扑排序然后就可以了 最后是3A 其中两次RE竟然是因为: scanf("%d",mm); ORZ 以后能用CIN还是CIN吧 QAQ 贴代码了: 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <math.h> 5 #include <iostre

UVALive 7077 Little Zu Chongzhi&#39;s Triangles (有序序列和三角形的关系)

这个题……我上来就给读错了,我以为最后是一个三角形,一条边可以由多个小棒组成,所以想到了状态压缩各种各样的东西,最后成功了……结果发现样例过不了,三条黑线就在我的脑袋上挂着,改正了以后我发现N非常小,想到了回溯每个棍的分组,最多分5组,结果发现超时了……最大是5^12 =  244,140,625,厉害呢…… 后来想贪心,首先想暴力出所有可能的组合,结果发现替换问题是一个难题……最后T T ,我就断片了.. 等看了别人的办法以后,我才发现我忽视了三角形的特性,和把数据排序以后的特点. 如果数据从

Gym 100299C &amp;&amp; UVaLive 6582 Magical GCD (暴力+数论)

题意:给出一个长度在 100 000 以内的正整数序列,大小不超过 10^ 12.求一个连续子序列,使得在所有的连续子序列中, 它们的GCD值乘以它们的长度最大. 析:暴力枚举右端点,然后在枚举左端点时,我们对gcd相同的只保留一个,那就是左端点最小的那个,只有这样才能保证是最大,然后删掉没用的. UVaLive上的数据有问题,比赛时怎么也交不过,后来去别的oj交就过了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000&qu

UVALive 6511 Term Project

Term Project Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ID: 651164-bit integer IO format: %lld      Java class name: Main 解题:强连通分量 1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 1

UVALive 6508 Permutation Graphs

Permutation Graphs Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ID: 650864-bit integer IO format: %lld      Java class name: Main 解题:逆序数 1 #include <bits/stdc++.h> 2 using namespace std; 3 typedef long l

UVALive 2659+HUST 1017+ZOJ 3209 (DLX

UVALive 2659 题目:16*16的数独.试了一发大白模板. /* * @author: Cwind */ //#pragma comment(linker, "/STACK:102400000,102400000") #include <iostream> #include <map> #include <algorithm> #include <cstdio> #include <cstring> #include

UVALive 5545 Glass Beads

Glass Beads Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Original ID: 554564-bit integer IO format: %lld      Java class name: Main Once upon a time there was a famous actress. As you may expect, she played mostly

UVALive 6145 Version Controlled IDE(可持久化treap、rope)

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4156 题目拷贝难度大我就不复制了. 题目大意:维护一个字符串,要求支持插入.删除操作,还有输出第 i 次操作后的某个子串.强制在线. 思路1:使用可持久化treap可破,详细可见CLJ的<可持久化数据结构的研究>. 思路2:rope大法好,详见:http