[考試反思]0604省選模擬105:星辰

開學第一場考試是辣雞$whzzt$出的題。題目毒瘤題解瞎寫。

這套題體驗又是極差。

雖說前倆題爆零這個事吧。。。

$T1$爲了卡常於是改了變量名然後沒改全掛了$10pts$問題不大。

$T2$無解判定少寫了一條直接把$20pts$也掛沒了問題依然不大。

$T3$的$60pts$倒是不低勉強扛住了這場的排名。

然而這次關鍵是在$T1$。並不是很難,但是根本沒有砸時間。

在學校狀態比在家是會好一些,貌似。不知道不吃早飯有沒有影響。

只剩下$7$場模擬了。。。

 

T1:解碼

大意:給定$n,m,c$。存在奇質數$p,q$使$pq=n,2 \le q-p \le 3 \times 10^5$,有$(c,(p-1)(q-1))=1$。求一個$x$使得$x^c \equiv m (\mod n)$。$10^9 \le p \le 2 \times 10^9,T \le 10^5$

答案肯定有$m^{\frac{1}{c}} (\mod n)$。$c$關於$\varphi(n)$有逆元所以直接搞就可以。

問題在於快速求$phi$也就是快速得到$p,q$。我們有$pq=n$。設$q=p+y$則有$p^2+py=n$。也就有$p=\frac{-y + \sqrt{y^2+4n}}{2}$

爲了讓它是個整數,所以$y^2+4n$一定要是$4$的倍數且爲完全平方數。設$t=\frac{y}{2}$則有$t^2+n=k^2$

我們枚舉$k$,下界是$\sqrt{n}$。由於$p \ge 10^9$此後$k$每增加$1$都會使$k^2$增加$O(10^9)$。

根據題意我們有$t \le 1.5 \times 10^5$。所以$t^2$這一項最多也就增長$\frac{(1.5 \times 10^5)^2}{10^9}=15$次左右。所以只需要枚舉$k$就行了。

需要快速乘。時間複雜度$O(Tlogn+15T)$

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 ll n,m,c;
 5 ll mul(ll a,ll b,ll m){return ((a*b-(ll)(1.L*a/m*b)*m)%m+m)%m;}
 6 ll qp(ll b,ll t,ll m,ll a=1){for(;t;t>>=1,b=mul(b,b,m))if(t&1)a=mul(a,b,m);return a;}
 7 void exgcd(ll a,ll b,ll&x,ll&y){
 8     if(!b){x=1;y=0;return;}
 9     exgcd(b,a%b,x,y);ll r=x;x=y;y=r-a/b*x;
10 }
11 ll inv(ll a,ll b){ll x,y;exgcd(a,b,x,y);return (x%b+b)%b;}
12 int main(){freopen("rsa.in","r",stdin);freopen("rsa.out","w",stdout);int t;scanf("%d",&t);while(t--){
13     scanf("%lld%lld%lld",&n,&m,&c);
14     ll k,t,p,q,phi;
15     k=sqrt(n);
16     while(1){
17         t=sqrt(k*k-n);
18         if(t*t+n==k*k)break;k++;
19     }phi=(k-t-1)*(k+t-1);
20     printf("%lld\n",qp(m,inv(c%phi,phi),n));
21 }}
View Code

 

T2:排列

大意:給定長爲$n$的數列$x$,構造$m$個長爲$n$的排列$P_i$並賦權$v_i$使得$0 \le v_i \le 1,\sum v_i =1,\sum P_iv_i=x,m \le n$。$n \le 500,eps=10^{-4}$

首先考慮無解判定。

$\sum\limits_{i=1}^{n} x_i = \frac{n(n+1)}{2}$

$\forall N\le n,\sum\limits_{i=1}^{N} x_i \ge \frac{N(N+1)}{2}$

必要性比較顯然。

充分性的話,考慮把$n!$種可能的排列都表示爲$n$維向量,那麼滿足上述條件的點構成的是一個平面凸包($\sum v_i =1$的限制所致)

進而考慮構造方法:每次按照當前的數列$x$的元素大小順序構造排列$P_i$。也就是最小的位置$a$對應$P_{i,a}=1$這樣。

然後可以二分$v_i$的值,存在單調性(如果減的數量不夠那就再減一輪)。

由於一個任意$n$維向量均可以由$n$個非線性相關的$n$維向量線性表出,所以一定可以構造出解。

稍微卡精。$O(n^2log\ eps)$

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ldb long double
 4 #define eps 1e-12L
 5 #define S 505
 6 ldb r[S],a[S],rat=1;int n,x[S],p[S];
 7 bool chk(){
 8     sort(r+1,r+1+n); ldb tot=0;
 9     for(int i=1;i<=n;++i){tot+=r[i]-rat*i;if(tot<-eps)return 0;}
10     return fabs(tot)<=eps;
11 }
12 bool cmp(int x,int y){return a[x]<a[y];}
13 int main(){
14     freopen("permutation.in","r",stdin);freopen("permutation.out","w",stdout);
15     scanf("%d",&n); for(int i=1;i<=n;++i)scanf("%Lf",&a[i]),r[i]=a[i],x[i]=i;
16     if(!chk())return puts("-1"),0; printf("%d\n",n);
17     for(int _=1;_<=n;++_){
18         sort(x+1,x+1+n,cmp); for(int i=1;i<=n;++i)p[x[i]]=i;
19         ldb L=0,R=rat,m;
20         while(m=(L+R)/2,R-L>1e-14L){
21             for(int i=1;i<=n;++i)r[i]=a[i]-p[i]*m;
22             rat-=m;if(chk())L=m;else R=m;rat+=m;
23         }
24         for(int i=1;i<=n;++i)a[i]-=p[i]*L;rat-=L;
25         printf("%.9Lf ",L);
26         for(int i=1;i<=n;++i)printf("%d ",p[i]);puts("");
27     }
28 }
View Code

 

T3:安排

先咕掉,等$WK$講或者再看看$std$再說。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章