• 10.24T3 解方程 取模意义下运算+秦九韶算法


    #1228 解方程

    描述

    已知多项式方程:

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

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

    输入

    输入共n + 2 行。

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

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

    输出

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

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

    样例输入[复制]
    输入样例#1:
    2 10 
    1
    -2
    1

    输入样例#2:
    2 10
    2
    -3
    1

    输入样例#3:
    2 10 




    样例输出[复制]
    输出样例#1:
    1
    1
    输出样例#2:
    2
    1
    2
    输出样例#3:
    0
    提示

    对于30%的数据:0<n<=2,|ai|<=100,an!=0,m<100

    对于50%的数据:0<n<=100,|ai|<=10^100,an!=0,m<100

    对于70%的数据:0<n<=100,|ai|<=10^10000,an!=0,m<10000

    对于100%的数据:0<n<=100,|ai|<=10^10000,an!=0,m<1000000

    由于在取模意义下解的结果是不会变化的,所以我们就可以随便选两个质数来保证解的唯一性

    如果我们找到了一个非解,那么根据同余的性质它加上模数的倍数肯定也不是解

    所以我们就可以直接做下来了

    code:

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 using namespace std;
     5 const long long mod1=117431;
     6 const long long mod2=102437;
     7 string a[1000];
     8 long long n,m,c[1005],b[100005],vis[2000005];
     9 long long QJS(long long x,int mod) {
    10     long long temp=b[1];
    11     for(long long i=1; i<=n; i++) {
    12         temp=(temp*x+b[i+1])%mod;
    13     }
    14 //    if(x==1)cout<<"temp="<<temp<<"
    ";
    15     return temp;
    16 }
    17 long long QJS2(long long x,int mod) {
    18     long long temp=c[1];
    19     for(long long i=1; i<=n; i++) {
    20         temp=(temp*x+c[i+1])%mod;
    21     }
    22 //    if(x==1)cout<<"TEMP="<<temp<<"
    ";
    23     return temp;
    24 }
    25 long long Ans[1000005];
    26 int pre1(string k) {
    27     int x=0,f=1,st=0;
    28     if(k[0]=='-')f=-1,st=1;
    29     for(int i=st; i<k.size(); i++) {
    30         x=(x<<3)+(x<<1)+k[i]-'0';
    31         x%=mod1;
    32     }
    33     return x*f;
    34 }
    35 int pre2(string k) {
    36     int x=0,f=1,st=0;
    37     if(k[0]=='-')f=-1,st=1;
    38     for(int i=st; i<k.size(); i++) {
    39         x=(x<<3)+(x<<1)+k[i]-'0';
    40         x%=mod2;
    41     }
    42     return x*f;
    43 }
    44 int main() {
    45 //    freopen("equation8.in","r",stdin);
    46     cin>>n>>m;
    47     for(long long i=1; i<=n+1; i++) {
    48         cin>>a[n+2-i];
    49     }
    50     for(int i=1; i<=n+1; i++) {
    51         b[i]=pre1(a[i]);
    52         c[i]=pre2(a[i]);
    53     }
    54     long long ans=0;
    55     int p[3];
    56     p[1]=mod1,p[2]=mod2;
    57     for(int i=1; i<=2; i++) {
    58         for(int x=0; x<p[i]; x++) {
    59             if(i==1) {
    60                 if(QJS(x,p[i])==0) {
    61                     for(int j=x; j<=m; j+=p[i]) {
    62                         if((++vis[j])==2) {
    63                             Ans[++ans]=j;
    64                         }
    65                     }
    66                 }
    67             } else {
    68                 if(QJS2(x,p[i])==0) {
    69                     for(int j=x; j<=m; j+=p[i]) {
    70                         if((++vis[j])==2) {
    71                             Ans[++ans]=j;
    72                         }
    73                     }
    74                 }
    75             }
    76         }
    77     }
    78     sort(Ans+1,Ans+ans+1);
    79     cout<<ans<<'
    ';
    80     for(long long i=1; i<=ans; i++) {
    81         cout<<Ans[i]<<'
    ';
    82     }
    83     return 0;
    84 }

    over

  • 相关阅读:
    服务控制器
    .Net Web项目安装包制作 (一)
    C#制作Windows service服务系列一:制作一个可安装、可启动、可停止、可卸载的Windows
    用Visual C#创建Windows服务程序
    插件的“动态替换”
    .Net Web项目安装包制作(三)补充说明
    .net打包/C#WinFrom程序打包
    C#制作Windows service服务系列三制作可控制界面的Windows服务(windows service)
    C#制作Windows service服务系列二演示一个定期执行的windows服务及调试
    .Net Web项目安装包制作 (二)数据库安装、其他组件的安装
  • 原文地址:https://www.cnblogs.com/saionjisekai/p/9847641.html
Copyright © 2020-2023  润新知