【noip 2014】 解方程 tyvj 4059

来源:互联网 发布:人间喜剧 王祖蓝 知乎 编辑:程序博客网 时间:2024/05/17 01:24

2014Day2T3

tyvj 4059

这题第一想法是 求根公式,结果一想,五次以上有吗,我的天啊。

然后 那就枚举吧
枚举 这么大的 数据范围咋整啊

然后 对不起大家 搜题解了。

很巧妙啊 ! 用一些素数 筛掉上面 更多的数就 ok了

嗯 素数怎么选、 越多越好吧
5个很好?
我用了3个。。

#include <iostream>  #include <cstdio>  #include <cstring>  #include <cstdlib>  #include <algorithm>  using namespace std;  #define maxn 1000010  #define int long longconst int prime[] = {10007,10917,30071,6247,7993};  int n,m;  long long a[110][6];  bool f[100000][6];  int cnt[maxn];  char s[10010];  bool calc(int value, int j) {      long long tmp = 0;      for (int i = n; i>=0; --i)          tmp = (tmp * value + a[i][j]) % prime[j];      return tmp != 0;  }  signed main(){      cin>>n>>m;      for (int i = 0; i <= n; ++i) {          scanf("%s", s);          int len = strlen(s);          int sign = 1;          for (int l = 0; l < len; ++l) {              if(s[l]=='-')                 sign = -1;              else                 for (int j = 0; j < 5; ++j)                      a[i][j]=( a[i][j] * 10 + s[l]-'0' ) % prime[j];          }          if (sign == -1)             for (int j = 0; j < 5; ++j)                 a[i][j] =  - a[i][j];      }      for (int j = 0; j < 5; ++j)          for(int i = 0; i < prime[j]; ++i)              f[i][j]=calc(i,j);      for (int i = 1; i <=m; ++i) {          bool flag = true;          for(int j = 0; j < 5; ++j)              if(f[i % prime[j]][j]) {                  flag = false; break;              }          if(flag)              cnt[++cnt[0]] = i;      }      printf("%lld\n", cnt[0]);      for (int i = 1; i <= cnt[0]; ++i)          printf("%lld\n",cnt[i]);      return 0;  }  
0 0
原创粉丝点击