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 }