[校内训练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
原文地址:https://www.cnblogs.com/GreenDuck/p/12213743.html