题解

13 条题解

  • 3
    @ 2014-11-17 12:31:06

    我来说一下这个题目怎么做. sujiao作为出题人, 如果有空最好也发一下说明, 估计小朋友等不动年鉴了...

    (1) 先说一下O(nm)的算法. 大家应该都知道可以把所有系数A_i都mod一个大素数, 之后在O(n)内判定一个数字x是不是解的方法了. 那么直接用这样的方法可以判定所有的数字, 时间复杂度是O(nm)的, 在noip现场应该可以得到期望得分70分. 在加强版的题目中应该可以得到40分.

    (2) 再说一下O(m)的算法, 这个算法应该是可以在noip现场轻松通过所有数据的. 因为O(nm)会超时, 那么我们不妨只考虑1<=x<=K<m的所有数字是不是解, 时间复杂度O(nk), 这里k需要自己选取. 之后对于1<=x<=m, 我们可以用已经算出来的x%k的结果, 去很大概率估计x是不是解. 有着更强正确率的方法是, 寻找若干个不同的k, 甚至最好选取k个大小相差不多的素数, 比如说我们选取10个k0,k1,...,k9. 那么x是不是根就利用x%ki来判定.

    (3) O(n^3+nsqrt(m))的算法, 我们选取素数p0,p1满足p0^2>=m,p1^2>m.然后在mod(pi)意义下算出来0<=x<pi的所有根, 这一部分的时间复杂度是O(nsqrt(m))的. 可以说明, 找到的两组根都不超过n个, 我们记为t1,t2,...,tu和s1,s2,...,sv. 那么我们断言原问题的可行根x一定可以通过某一个ti和某一个sj组合得到, 再利用O(n)的方法判定是不是根. 这一部分的时间复杂度是O(n^3), 这样可以通过所有的数据.

    最后散扯一句, 利用heoi2012的Akai的数学作业一题的方法, 可以在noip现场骗到满分. heoi2012这个题目当年就是我出的, 所以过一段时间我就在vijos上挂出来. [等我找到遗失的数据之后...=_=...]

    • @ 2014-11-29 18:47:29

      请问解法三中 找到的两组根都不超过n个是为什么? 是根据n次方程最多有n个解么,但是这是同余方程,比如模p,左边可以使0,p,2p,3p... 左边等于kp,对于每个k,都可能有n个解吧... 大神能解释一下么。
      还有原问题的可行根x一定可以通过某一个ti和某一个sj组合得到 这又是为什么呢。

  • 2
    @ 2017-10-15 23:49:32

    。。。代码都有很多了,我建议三个好运质数。
    15013,15083,30323;
    三个一起验证应该就能过了

    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #define ll long long
    using namespace std;
    const int MOD1=15013;
    const int MOD2=30323;
    const int MOD3=15083;
    const int LIM=10033;
    char s[LIM];
    int n,m;
    int a1[103],a2[103],a3[103];
    int ans[1000033],acnt=0;
    int main()
    {
        scanf("%d%d",&n,&m);
        ll a,b,c;int len;
        bool flag;
        for(int i=0;i<=n;++i)
        {
            flag=0;
            scanf("%s",s);
            if(s[0]=='-') {
                flag=1;
                s[0]='0';
            }
            len=strlen(s);
            a=0;b=0;c=0;
            for(int j=0;j<len;++j)
            {
                a=(a*10+s[j]-'0')%MOD1;
                b=(b*10+s[j]-'0')%MOD2;
                c=(c*10+s[j]-'0')%MOD3;
            }
            if(flag){
                a1[i]=-a;
                a2[i]=-b;
                a3[i]=-c;
            }else{
                a1[i]=a;
                a2[i]=b;
                a3[i]=c;            
            }
        }
        ll mi1,mi2,mi3;
        ll sum1,sum2,sum3;
        for(int i=1;i<=m;++i)
        {
            mi1=1,mi2=1,mi3=1;
            sum1=a1[0];
            sum2=a2[0];
            sum3=a3[0];
            for(int j=1;j<=n;++j)
            {
                mi1=mi1*i%MOD1;
                mi2=mi2*i%MOD2;
                mi3=mi3*i%MOD3;
                sum1+=a1[j]*mi1%MOD1;
                sum2+=a2[j]*mi2%MOD2;
                sum3+=a3[j]*mi3%MOD3;
            }
            sum1=(sum1+MOD1)%MOD1;
            sum2=(sum2+MOD2)%MOD2;
            sum3=(sum3+MOD3)%MOD3;
            if(sum1==0&&sum2==0&&sum3==0){
                ans[++acnt]=i;
            }
        }
        printf("%d\n",acnt);
        for(int i=1;i<=acnt;++i)
        {
            printf("%d\n",ans[i]);
        }
        return 0;
    }
    
  • 1
    @ 2015-10-20 23:25:27

    一开始质数选的太大,导致后三个点超时,换了小点的就过了......
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>

    using namespace std;

    int n, m;
    char a[105][10005];
    int len[105];
    long long mo[10][105];
    int MOD[8] = {0, 73019, 78919, 78901};
    int ans[1000005], cnt;
    bool flag[1000005];

    void calcu(int k, int num, int st) {
    if (st == 0)
    for (int i = st; i < len[num]; ++i) {
    mo[k][num] *= 10;
    mo[k][num] += (a[num][i] - '0');
    mo[k][num] %= MOD[k];
    }
    else
    for (int i = st; i < len[num]; ++i) {
    mo[k][num] *= 10;
    mo[k][num] += ((-(a[num][i] - '0')) % MOD[k] + MOD[k]);
    mo[k][num] %= MOD[k];
    }

    }
    long long pow(int p, int q, int k) {
    if (q == 1)
    return p;
    if (q & 1)
    return ((pow(p, q - 1, k) * p ) % MOD[k]);
    else {
    long long x = pow(p, q / 2, k) % MOD[k];
    return (x * x) % MOD[k];
    }
    }
    int main(int argc, const char argv[]) {
    scanf("%d %d", &n, &m);
    char p;
    getchar();
    for (int i = 0; i <= n; ++i) {
    p = getchar();
    while (p == '-' || '0' <= p && p <= '9') {
    a[i][len[i]++] = p;
    p = getchar();
    }
    }
    int st;
    for (int k = 1; k <= 3; ++k) {
    for (int i = 0; i <= n; ++i) {
    if (a[i][0] == '-')
    st = 1;
    else
    st = 0;
    calcu(k, i, st);
    }
    }
    long long sum;
    for (int i = 1; i <= m; ++i) {
    if (flag[i])
    continue;
    bool f = true;
    for (int k = 1; k <= 3; ++k) {
    sum = mo[k][n];/

    for (int j = 1; j <= n; ++j) {
    sum += (mo[k][j] * pow(i, j, k)) % MOD[k];
    sum %= MOD[k];
    }*/
    for (int j = n - 1; j >= 0; --j) {
    sum *= i;
    sum %= MOD[k];
    sum += mo[k][j];
    sum %= MOD[k];
    }
    if (sum != 0) {
    for (int j = i; j <= m; j += MOD[k])
    flag[j] = true;
    f = false;
    break;
    }
    }
    if (f) {
    ans[++cnt] = i;
    }
    }
    printf("%d\n", cnt);
    for (int i = 1; i <= cnt; ++i) printf("%d\n", ans[i]);
    return 0;
    }

    • @ 2015-10-20 23:27:23

      快速幂最后没用,是因为听说了秦九韶算法

  • 0
    @ 2018-08-05 16:49:05

    MOD几个质数,测试即可

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define MOD1 23593
    #define MOD2 30271
    #define MOD3 32213
    
    #define DIG(x) (x - '0')
    
    char eqn[101][10005];
    
    int m1[101];
    int m2[101];
    int m3[101];
    
    int m1_results[MOD1];
    int m2_results[MOD2];
    int m3_results[MOD3];
    
    int n, m;
    
    void check(int mod, int *coeffs, int *results)
    {
        int i, j;
        for (i = 0; i <= n; i++) {
            int last;
            int ans;
            int base = 0;
            if (eqn[i][0] == '-')
                base = 1;
            if (strlen(eqn[i]) < 5 + base) {
                coeffs[i] = atoi(eqn[i]);
                continue;
            }
            ans = DIG(eqn[i][base])*10000 + DIG(eqn[i][base+1])*1000 +
                DIG(eqn[i][base+2])*100 + DIG(eqn[i][base+3])*10 + DIG(eqn[i][base+4]);
            for (last = base + 4; eqn[i][last]; last++) {
                ans %= mod;
                if (eqn[i][last+1]) {
                    ans *= 10;
                    ans += DIG(eqn[i][last+1]);
                }
            }
            if (base) {
                coeffs[i] = mod - ans;
                if (coeffs[i] == mod) {
                    coeffs[i] = 0;
                }
            } else {
                coeffs[i] = ans;
            }
            /*printf("%d\n", coeffs[i]);*/
        }
        for (i = 0; i < mod; i++) {
            int pwrs[101];
            int eval_result = 0;
            pwrs[0] = 1;
            for (j = 1; j <= n; j++) {
                pwrs[j] = pwrs[j-1] * i;
                pwrs[j] %= mod;
            }
            for (j = 0; j <= n; j++) {
                eval_result += (((coeffs[j] * pwrs[j]) % mod) + mod) % mod;
                /*if (i == 1) {
                    printf("%d %d %d\n", coeffs[j], pwrs[j], eval_result);
                }*/
                if (eval_result >= mod) eval_result -= mod;
            }
            results[i] = eval_result;
        }
    }
    
    int main()
    {
        int i, cnt = 0;
        scanf("%d%d", &n, &m);
        for (i = 0; i <= n; i++) {
            scanf("%s", eqn[i]);
        }
        check(MOD1, m1, m1_results);
        check(MOD2, m2, m2_results);
        check(MOD3, m3, m3_results);
        for (i = 1; i <= m; i++) {
            if (!m1_results[i % MOD1] && !m2_results[
                    i % MOD2] && !m3_results[i % MOD3]) {
                cnt++;
            }
        }
        printf("%d\n", cnt);
        for (i = 1; i <= m; i++) {
            if (!m1_results[i % MOD1] && !m2_results[
                    i % MOD2] && !m3_results[i % MOD3]) {
                printf("%d\n", i);
            }
        }
        return 0;
    }
    
    
  • 0
    @ 2016-11-07 21:21:55

    #include<iostream>

    #include<cstdio>

    #include<algorithm>

    #include<vector>

    #define mo1 21893

    #define mo2 18341629

    using namespace std;

    char s[150][10000+50];
    vector<int> ans,line;
    int xishu1[150],xishu2[150],n,m;
    void read(string &kk)
    {
    int cnt=0;
    char c;
    c=getchar();
    while(c!='\n')
    {
    kk[cnt++]=c;
    c=getchar();
    }
    }
    int main()
    {
    bool fuhao;
    scanf("%d%d",&n,&m);
    for(int i=0;i<=n;i++)
    scanf("%s",s[i]);
    for(int i=0;i<=n;i++)
    {
    int temp1=0,temp2=0;
    fuhao=false;
    for(int j=0;;j++)
    {

    if(s[i][j]>'9'|s[i][j]<'0') if(s[i][j]!='-') break;
    if(s[i][j]=='-') {fuhao=true;continue;}
    temp1=temp1*10+(s[i][j]-'0'),temp1%=mo1;
    temp2=temp2*10+(s[i][j]-'0'),temp2%=mo2;
    }
    xishu1[i]=temp1;xishu2[i]=temp2;
    if(fuhao) xishu1[i]*=-1,xishu2[i]*=-1;
    }

    for(int i=1;i<=mo1;i++)
    {
    long long val=0,pow=1;
    for(int j=0;j<=n;j++)
    {
    (val += xishu1[j] * pow) %=mo1;
    pow = pow * i % mo1;
    }
    if(val==0)
    {
    int key=i;
    while(key<=m)
    {
    line.push_back(key);
    key+=mo1;

    }
    }
    }

    for(int i=0;i<line.size();i++)
    {
    long long val=0,pow=1;
    for(int j=0;j<=n;j++)
    {
    (val += xishu2[j] * pow) %=mo2;
    pow = pow * line[i] % mo2;
    }
    if(val==0)
    ans.push_back(line[i]);
    }
    printf("%d\n",ans.size());
    sort(ans.begin(),ans.end());
    for(int i=0;i<ans.size();i++)
    printf("%d\n",ans[i]);
    return 0;
    }

  • 0
    @ 2015-10-21 18:55:56

    没啥好讲的。似乎就是有那么个数学方法吧、、反正至少30分是白送的。。

    最下面的DOC大大已经基本讲的很明白了。反正就是选几个大素数,拿系数去mod再判断。如果多个素数都枚举成立就能当作是正确答案。至于素数选那几个反正比较接近就差不多了。

    如果问去哪里找素数= =自己花5分钟写个素数筛输出所有素数自己选吧= =

  • 0
    @ 2015-10-20 21:37:44

    #include<iostream>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    using namespace std;
    const int MAXN = 10000 + 10;
    const int Q = 4;

    int q[10] = {0, 14983, 14947, 24989, 19997, 11987, 13999};
    char s[MAXN];
    int num[MAXN], a[200][10], isAns[1000000 + 10];
    vector<int> v[10], ans;

    int chu(int* S, int a, int len){
    int N[MAXN] = {};
    for(int i=1; i<=len; i++)
    N[i] = S[i];
    N[0] = 0;
    for(int i=len; i>=1; i--){
    while(N[i] < a && i > 1){
    N[i-1] += N[i]*10;
    N[i] = 0;
    i--;
    }
    N[i-1] += N[i]%a*10;
    N[i] /= a;
    }
    return N[0]/10;
    }

    int main()
    {
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i=0; i<=n; i++){
    scanf("%s", &s[1]);
    int len = strlen(&s[1]);
    if(s[1] == '-'){
    for(int j=1; j<len; j++)
    num[j] = s[len-j+1]-'0';
    len--;
    for(int j=1; j<=Q; j++)
    a[i][j] = -chu(num, q[j], len);

    }
    else{
    for(int j=1; j<=len; j++)
    num[j] = s[len-j+1]-'0';
    for(int j=1; j<=Q; j++)
    a[i][j] = chu(num, q[j], len);
    }
    }
    for(int i=1; i<=Q; i++)
    for(int j=1; j<=q[i]; j++){
    int ans = a[n][i];
    for(int u=n-1; u>=0; u--)
    ans = ((ans*j)%q[i]+a[u][i])%q[i];
    if(ans == 0){
    int bri = j;
    while(bri <= m){
    v[i].push_back(bri);
    bri += q[i];
    }
    }
    }
    for(int i=1; i<=Q; i++)
    for(int j=0; j<v[i].size(); j++)
    isAns[v[i][j]]++;
    for(int i=1; i<=m; i++)
    if(isAns[i] == Q)
    ans.push_back(i);
    printf("%d\n", ans.size());
    for(int i=0; i<ans.size(); i++)
    printf("%d\n", ans[i]);
    return 0;
    }
    代码有点乱,让大神见笑了。。用秦九韶算法优化

  • 0
    @ 2015-09-25 23:18:29

    P1910解方程
    Accepted

    记录信息

    评测状态 Accepted
    题目 P1910 解方程
    递交时间 2015-09-25 23:17:48
    代码语言 C++
    评测机 VijosEx
    消耗时间 1435 ms
    消耗内存 36820 KiB
    评测时间 2015-09-25 23:17:51

    评测结果

    编译成功

    foo.cpp: In function 'bool check(int)':
    foo.cpp:18:13: warning: unused variable 'j' [-Wunused-variable]
    int i , j , flag = 0;
    ^
    foo.cpp:18:17: warning: unused variable 'flag' [-Wunused-variable]
    int i , j , flag = 0;
    ^

    测试数据 #0: Accepted, time = 15 ms, mem = 36816 KiB, score = 10

    测试数据 #1: Accepted, time = 0 ms, mem = 36820 KiB, score = 10

    测试数据 #2: Accepted, time = 15 ms, mem = 36816 KiB, score = 10

    测试数据 #3: Accepted, time = 0 ms, mem = 36816 KiB, score = 10

    测试数据 #4: Accepted, time = 16 ms, mem = 36816 KiB, score = 10

    测试数据 #5: Accepted, time = 234 ms, mem = 36820 KiB, score = 10

    测试数据 #6: Accepted, time = 234 ms, mem = 36820 KiB, score = 10

    测试数据 #7: Accepted, time = 281 ms, mem = 36820 KiB, score = 10

    测试数据 #8: Accepted, time = 281 ms, mem = 36816 KiB, score = 10

    测试数据 #9: Accepted, time = 359 ms, mem = 36820 KiB, score = 10

    Accepted, time = 1435 ms, mem = 36820 KiB, score = 100

    代码

    #include <iostream>
    #include <stdio.h>
    #include <queue>

    using namespace std;

    int mod[7 + 2] = { 19 , 101 , 11261 , 19997 , 22877 , 21893 , 14843 };
    int n , m , ans[1000000 + 2];
    char a[100 + 10][10000 + 10];
    int i , j , k;
    int power[1000000 + 2];
    int ver[7][1000000 + 2];
    queue < int > q;
    int num;

    bool check( int x )
    {
    int i , j , flag = 0;
    long long ans = 0;
    power[0] = 1;
    for( i = 1 ; i <= n ; i++ )
    power[i] = power[i - 1] * x % mod[k];
    for( i = 0 ; i <= n ; i++ )
    {
    if( a[i][0] != '-' )
    ans += ver[k][i] * power[i];
    else
    ans -= ver[k][i] * power[i];
    ans %= mod[k];
    }
    while( ans < 0 )
    ans += mod[k];
    return !( ans % mod[k] );
    }

    int main()
    {
    scanf( "%d %d" , &n , &m );
    for( i = 0 ; i <= n ; i++ )
    scanf( "%s" , a[i] );

    for( k = 0 ; k < 7 ; k++ )
    for( i = 0 ; i <= n ; i++ )
    for( j = 0 ; a[i][j] ; j++ )
    {
    if( a[i][j] == '-' )
    continue;
    ver[k][i] *= 10;
    ver[k][i] += a[i][j] - '0';
    ver[k][i] %= mod[k];
    }
    for( k = 0 ; k < 7 ; k++ )
    for( i = 0 ; i < mod[k] && i <= m ; i++ )
    if( check( i ) )
    for( j = i ; j <= m ; j += mod[k] )
    ans[j]++;
    for( i = 1 ; i <= m ; i++ )
    if( ans[i] == 7 )
    {
    num++;
    q.push( i );
    }
    printf( "%d\n" , num );
    while( !q.empty() )
    printf( "%d\n" , q.front() ) , q.pop();
    return 0;
    }

  • 0
    @ 2015-03-16 08:06:20

    前面都是C++的代码,我发一个Pascal的代码
    const
    hash:array[1..10]of int64=
    (1007,10007,12347,12349,100017,111647,
    19720308,19750920,19981117,20150208);

    type data=array[1..10]of int64;

    procedure readdata(var a:data);
    var c:char;
    b:boolean;
    i:longint;
    n:int64;
    begin
    for i:=1 to 10 do a[i]:=0;
    repeat read(c);
    until (c>='0')and(c<='9')or(c='-');
    if c='-' then
    begin
    b:=true;
    read(c);
    end else b:=false;

    while (c>='0')and(c<='9') do
    begin
    n:=ord(c)-48;
    for i:=1 to 10 do a[i]:=(a[i]*10+n)mod hash[i];
    read(c);
    end;

    if b then
    for i:=1 to 10 do if a[i]<>0 then a[i]:=hash[i]-a[i];
    end;

    var
    a:array[0..100]of data;
    list:array[1..1000000]of longint;
    n,m,i,j,k,x,top:longint;
    ok:array[1..1000000]of boolean;

    function check2(x:int64;k:longint):boolean;
    var i:longint;
    sum:int64;
    begin
    sum:=0;
    for i:=n downto 0 do
    sum:=(sum*x+a[i][k])mod hash[k];
    if sum<>0 then
    begin
    i:=x;
    while i<=m do
    begin
    ok[i]:=true;
    i:=i+hash[k];
    end;
    end;
    exit(sum=0);
    end;

    function check(x:int64):boolean;
    var k:longint;
    begin
    if ok[x] then exit(false);
    for k:=1 to 10 do
    if check2(x,k)=false then exit(false);
    exit(true);
    end;

    begin

    readln(n,m);
    for i:=0 to n do readdata(a[i]);
    for i:=1 to m do
    if check(i) then
    begin
    inc(top);
    list[top]:=i;
    end;
    writeln(top);
    for i:=1 to top do writeln(list[i]);

    end.

  • 0
    @ 2015-02-25 11:29:15

    貌似数据不全是noip的,因为noip我的数据全过,但是vijos的7错了
    然后我又不想改程序,写程序,然后我就改了一下质数的值
    改了其中的一个……
    但是还是一样的结果,然后就去看题解,发现有大神说选取的质数要尽量接近,然后我发现我的质数都是挨着的
    然后我就想,是不是我选取的质数太接近10的次方了(不是这道题,什么质数不要接近2和10的次方)
    然后我就在10000以内的质数表里找出了两个8000多的,然后保留两个9000多的
    然后就过去了,总感觉有一种侥幸的感觉
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    char a[10005];
    int n,m;
    int x;
    int a1[120],a2[120],a3[120],a4[120],fu;
    int x1,x2,x3,x4;
    int tx1,tx2,tx3,tx4;
    int s1,s2,s3,s4;
    int p1 = 9901,p2 = 9907,p3 = 8087,p4 = 8089;
    int ans1 = 0,ans[10000002];
    int can1[10000],can2[10000],can3[10000],can4[10000];
    int main()
    {
    int i,j,k;
    scanf("%d%d",&n,&m);
    for (i = 0;i <= n;i++) {
    scanf("%s",a);
    a1[i] = a2[i] = a3[i] = a4[i] = 0;
    if ((a[0] >= '0') && (a[0] <= '9')) {
    j = 0;
    fu = 1;
    } else {
    j = 1;
    if (a[0] == '-')
    fu = -1;
    else
    fu = 1;
    }
    for (;a[j];j++) {
    a1[i] = (a1[i]*10+a[j]-'0')%p1;
    a2[i] = (a2[i]*10+a[j]-'0')%p2;
    a3[i] = (a3[i]*10+a[j]-'0')%p3;
    a4[i] = (a4[i]*10+a[j]-'0')%p4;
    }
    a1[i] *= fu; a2[i] *= fu; a3[i] *= fu; a4[i] *= fu;
    }

    if (m <= 10000) {
    for (x = 1;x <= m;x++) {
    x1 = x%p1; x2 = x%p2; x3 = x%p3; x4 = x%p4;
    s1 = s2 = s3 = s4 = 0;
    tx1 = tx2 = tx3 = tx4 = 1;
    for (i = 0;i <= n;i++) {
    s1 = (s1+a1[i]*tx1)%p1;
    s2 = (s2+a2[i]*tx2)%p2;
    s3 = (s3+a3[i]*tx3)%p3;
    s4 = (s4+a4[i]*tx4)%p4;
    tx1 = (tx1*x1)%p1;
    tx2 = (tx2*x2)%p2;
    tx3 = (tx3*x3)%p3;
    tx4 = (tx4*x4)%p4;
    }
    if ((0 == s1) && (0 == s2) && (0 == s3) && (0 == s4))
    ans[ans1++] = x;
    }
    printf("%d\n",ans1);
    for (i = 0;i < ans1;i++)
    printf("%d\n",ans[i]);
    } else {
    memset(can1,0,sizeof(can1));
    for (x = 0;x < p1;x++) {
    x1 = x; s1 = 0; tx1 = 1;
    for (i = 0;i <= n;i++) {
    s1 = (s1+a1[i]*tx1)%p1;
    tx1 = (tx1*x1)%p1;
    }
    if (0 == s1)
    can1[x] = 1;
    }

    memset(can2,0,sizeof(can2));
    for (x = 0;x < p2;x++) {
    x2 = x; s2 = 0; tx2 = 1;
    for (i = 0;i <= n;i++) {
    s2 = (s2+a2[i]*tx2)%p2;
    tx2 = (tx2*x2)%p2;
    }
    if (0 == s2)
    can2[x] = 1;
    }

    memset(can3,0,sizeof(can3));
    for (x = 0;x < p3;x++) {
    x3 = x; s3 = 0; tx3 = 1;
    for (i = 0;i <= n;i++) {
    s3 = (s3+a3[i]*tx3)%p3;
    tx3 = (tx3*x3)%p3;
    }
    if (0 == s3)
    can3[x] = 1;
    }

    memset(can4,0,sizeof(can4));
    for (x = 0;x < p4;x++) {
    x4 = x; s4 = 0; tx4 = 1;
    for (i = 0;i <= n;i++) {
    s4 = (s4+a4[i]*tx4)%p4;
    tx4 = (tx4*x4)%p4;
    }
    if (0 == s4)
    can4[x] = 1;
    }

    for (x = 1,ans1 = 0;x <= m;x++) {
    if ((can1[x%p1]) && (can2[x%p2]) &&
    (can3[x%p3]) && (can4[x%p4]))
    ans[ans1++] = x;
    }
    printf("%d\n",ans1);
    for (i = 0;i < ans1;i++)
    printf("%d\n",ans[i]);
    }
    return 0;
    }

  • 0
    @ 2014-11-26 13:39:03

    #include <bits/stdc++.h>
    using namespace std;
    //
    const long long MOD[5]={10007,11261,14843,19997,21893};
    string a_i[100+5];
    long long a[5][100+5];
    long long f[5][25000+5];
    bool sign[10000000+5];
    char t[1000000+5];
    int N,M;
    vector<int> l;
    int tot=0;
    //
    inline long long change(const string& x,int pos)
    {
    long long ans=0;
    int len=x.size();
    if(x[0]=='-')
    {
    for(int i=1;i<len;++i)
    {
    ans=ans*10+x[i]-'0';
    ans%=MOD[pos];
    }
    return -ans;
    }
    else
    {
    for(int i=0;i<len;++i)
    {
    ans=ans*10+x[i]-'0';
    ans%=MOD[pos];
    }
    return ans;
    }
    }
    //
    int main()
    {
    cin>>N>>M;
    for(int i=0;i<=N;++i)
    {
    memset(t,0,sizeof(t));
    scanf("%s",t);
    string p(t);
    a_i[i]=t;
    //
    a[0][i]=change(a_i[i],0);
    a[1][i]=change(a_i[i],1);
    a[2][i]=change(a_i[i],2);
    a[3][i]=change(a_i[i],3);
    a[4][i]=change(a_i[i],4);
    //
    }
    for(int x=0;x!=5;++x)
    {
    for(int i=1;i<=MOD[x];++i)
    {
    long long ans=0;
    for(int p=N;p>=0;--p)
    {
    ans=ans*i+a[x][p];
    ans%=MOD[x];
    }
    f[x][i]=ans;

    }
    }
    for(int x=0;x!=5;++x)
    {
    for(int i=1;i<=M;++i)
    {
    int now=i%MOD[x];
    if(f[x][now]!=0) sign[i]=1;
    }
    }
    for(int i=1;i<=M;++i)
    if(sign[i]==0)
    {
    tot++;
    l.push_back(i);
    }
    cout<<tot<<endl;
    for(int i=0;i!=l.size();++i)
    cout<<l[i]<<endl;
    return 0;
    }

  • -1
    @ 2016-11-07 21:21:06

    测试数据 #0: Accepted, time = 0 ms, mem = 2028 KiB, score = 10
    测试数据 #1: Accepted, time = 0 ms, mem = 2036 KiB, score = 10
    测试数据 #2: Accepted, time = 0 ms, mem = 2032 KiB, score = 10
    测试数据 #3: Accepted, time = 31 ms, mem = 2024 KiB, score = 10
    测试数据 #4: Accepted, time = 15 ms, mem = 2028 KiB, score = 10
    测试数据 #5: Accepted, time = 62 ms, mem = 2032 KiB, score = 10
    测试数据 #6: Accepted, time = 62 ms, mem

  • 1

信息

ID
1910
难度
7
分类
(无)
标签
递交数
2942
已通过
508
通过率
17%
被复制
7
上传者