• [校内训练20_01_19]ABC


    1.SB题


    2.有n个点,m条边,每次加入一条边,你要挑出一些边,使得形成的图每个点度数都为奇数,且最长的边最短。


    3.给一个N次多项式,问有多少个质数在任意整数处的点值都是p的倍数,输出它们。$N leq 1000,|a_i| leq 10^9$

    问题等价于这个多项式在mod p意义下存在因数(x-i),i取遍所有整数。

    那么p满足要求,等价于这个N次多项式存在因数$x(x-1)(x-2)...(x-p+1)=x^p-x(mod p)$

    因此,p要么是系数gcd的质因数,要么在N以内。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=1E5+5;
     4 typedef long long int ll;
     5 ll n,a[maxn],ans[maxn];
     6 const int limit=100000;
     7 int size,prime[maxn],tmp[maxn],tmp1[maxn],tmp2[maxn];
     8 bool vis[maxn];
     9 void init()
    10 {
    11     for(int i=2;i<=limit;++i)
    12     {
    13         if(!vis[i])
    14             prime[++size]=i;
    15         for(int j=1;j<=size&&prime[j]*i<=limit;++j)
    16         {
    17             vis[prime[j]*i]=1;
    18             if(i%prime[j]==0)
    19                 break;
    20         }
    21     }
    22 }
    23 inline int get(ll x,int mod)
    24 {
    25     ll sum=0;
    26     for(int i=n;i>=0;--i)
    27         sum=(sum*x%mod+a[i]%mod+mod)%mod;
    28     return sum;
    29 }
    30 inline bool check(int x)
    31 {
    32     if(a[0]%x!=0)
    33         return false;
    34     for(int i=1;i<=5;++i)
    35         if(get(prime[i],x)!=0)
    36             return false;
    37     for(int i=1;i<=5;++i)
    38         if(get(666666-i+1,x)!=0)
    39             return false;
    40     return true;
    41 }
    42 inline int get(ll x)
    43 {
    44     int g=0;
    45     for(ll i=2;i*i<=x;++i)
    46         while(x%i==0)
    47         {
    48             tmp[++g]=i;
    49             x/=i;
    50         }
    51     if(x>=2)
    52         tmp[++g]=x;
    53     for(int i=1;i<=size;++i)
    54         if(prime[i]<=n)
    55             tmp[++g]=prime[i];
    56     sort(tmp+1,tmp+g+1);
    57     g=unique(tmp+1,tmp+g+1)-tmp-1;
    58     return g;
    59 }
    60 inline int gcd(int x,int y)
    61 {
    62     if(y==0)
    63         return x;
    64     return x%y==0?y:gcd(y,x%y);
    65 }
    66 void solve()
    67 {
    68     init();
    69     ll V=a[0];
    70     for(int i=1;i<=n;++i)
    71         V=gcd(V,a[i]);
    72     int g=get(abs(V));
    73     for(int i=1;i<=g;++i)
    74         if(check(tmp[i]))
    75             cout<<tmp[i]<<endl;
    76 }
    77 int main()
    78 {
    79     freopen("poly.in","r",stdin);
    80     freopen("poly.out","w",stdout);
    81     ios::sync_with_stdio(false);
    82     cin>>n;
    83     for(int i=n;i>=0;--i)// 反过来
    84         cin>>a[i];
    85     solve();
    86     return 0;
    87 }
    View Code
  • 相关阅读:
    .Net 4.0 之并行运算(Parallel)(For、Foreach)
    【POJ】3494 Largest Submatrix of All 1’s
    【POJ】2676 Sudoku
    【POJ】3250 Bad Hair Day
    【SPOJ】11578 A Famous City
    【POJ】3740 Easy Finding
    【HUST】1017 Exact cover
    【POJ】3074 Sudoku
    【ZOJ】3209 Treasure Map
    【POJ】3076 Sudoku
  • 原文地址:https://www.cnblogs.com/GreenDuck/p/12213743.html
Copyright © 2020-2023  润新知