zoukankan      html  css  js  c++  java
  • NOIP2014 uoj20解方程 数论(同余)

    又是数论题


    Q&A

    Q:你TM做数论上瘾了吗

    A:没办法我数论太差了,得多练(shui)啊


    题意

    题目描述

    已知多项式方程:

    a0+a1x+a2x^2+..+anx^n=0

    求这个方程在[1, m ] 内的整数解(n 和m 均为正整数)

    输入输出格式

    输入格式:

    输入文件名为equation .in。

    输入共n + 2 行。

    第一行包含2 个整数n 、m ,每两个整数之间用一个空格隔开。

    接下来的n+1 行每行包含一个整数,依次为a0,a1,a2..an

    输出格式:

    输出文件名为equation .out 。

    第一行输出方程在[1, m ] 内的整数解的个数。

    接下来每行一个整数,按照从小到大的顺序依次输出方程在[1, m ] 内的一个整数解。


    我们来看看这鬼畜的NOIP题目怎么做(shui)

    讲道理,这道题最难的地方在于:不知谁在洛谷上给它贴上了高精度的标签(管理给我滚粗来)我想知道有多少人在这狗血标签的引导下怒写高精+压位+秦九昭+各种奇技淫巧优化,最后拿个T回去哭


     正解并没有用到高精度(虽然我写的输入是仿照高精度的,但是hzw大的代码是直接字符串处理的Orz)
    但是hzw用了一个神奇的pre来存x的i次方,我懒得打就打了一个秦九昭(讲道理,秦九昭不会比暴力难打,而且可以少开一个数组)

    顺便一提,据说大神用过的质数会有灵气,我直接用了hzw用的5个质数当mod

    对于5个(其实无所谓选几个,多一点可以保险一些我这种rp不佳的必备)选出的质数p,每个都处理出1~p-1代入原式modp算出的结果

    这个结果就可以代表所有modp同余的数的结果(因为显然每次增加p的话,结果变化量是p的倍数,modp以后不会变),若modp以后不为0则一定不是方程解

    尽管我们不能保证为0的话实际结果就一定是0,但是用5个数都验证一遍以后基本就能保证这个结果为0

    ===没了===


    上代码

     1 #include<cstdio>
     2 int mod[5]={11261,19997,22877,21893,14843};
     3 int n,m;
     4 int ans[1000005];
     5 int a[5][105],res[5][30005],aa[105][10005],num[105];
     6 bool flag[105];
     7 int main()
     8 {
     9     scanf("%d%d",&n,&m);
    10     char ch=getchar();
    11     for(int i=0;i<=n;i++)
    12         for(num[i]=0,flag[i]=false,ch=getchar();(ch>='0' && ch<='9')||(ch=='-');ch=getchar())
    13             if(ch=='-')
    14                 flag[i]=true;
    15             else
    16                 aa[i][++num[i]]=ch-'0';
    17     for(int i=0;i<5;i++)
    18         for(int j=0;j<=n;j++)
    19         {
    20             a[i][j]=0;
    21             for(int k=1;k<=num[j];k++)
    22                 a[i][j]=(a[i][j]*10+aa[j][k])%mod[i];
    23             if(flag[j])
    24                 a[i][j]=-a[i][j];
    25         }
    26     for(int t=0;t<5;t++)
    27         for(int x=1;x<mod[t];x++)
    28         {
    29             int sum=0;
    30             for(int i=n;i>=0;i--)
    31                 sum=(sum*x+a[t][i])%mod[t];
    32             res[t][x]=sum;
    33         }
    34     int sum=0;
    35     bool flag;
    36     for(int i=1;i<=m;i++)
    37     {
    38         flag=true;
    39         for(int t=0;t<5;t++)
    40             if(res[t][i%mod[t]]!=0)
    41             {
    42                 flag=false;
    43                 break;
    44             }
    45         if(flag)
    46             ans[++sum]=i;
    47     }
    48     printf("%d
    ",sum);
    49     for(int i=1;i<=sum;i++)
    50         printf("%d
    ",ans[i]);
    51     return 0;
    52 }
  • 相关阅读:
    centos7下编译安装redis5.05
    rest_framework:版本控制
    rest_framework:响应器(渲染器)
    rest_framework:解析器
    rest_framework:url控制
    针对用户做限制(频率)
    更改Android设备System目录的文件的写入权限
    monkey命令解析详解
    Pycharm2019最新激活注册码(pycharm激活教程)
    Windows下Linux虚拟机的配置以及Win10 linux子系统开启
  • 原文地址:https://www.cnblogs.com/wanglichao/p/5683694.html
Copyright © 2011-2022 走看看