【noip 2014】 解方程 tyvj 4059

13 篇文章 0 订阅
13 篇文章 3 订阅

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 long
const 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值