題目地址1001 簽到 題意:給a,b ,每次 a,b 會變?yōu)閍+b,a?b ,問 k 次之后變成了哪兩個數(shù),對998244353 取模,多組數(shù)據(jù)。 思路:模擬一下,算幾個數(shù),發(fā)現(xiàn)是有規(guī)律的,如果k是奇數(shù),結(jié)果就是(a+b)?2k/2modmo,(a?b+mo)?2k/2modmo(a+b)*2^{k/2}\mod mo,(a-b+mo)*2^{k/2}\mod mo(a+b)?2k/2modmo,(a?b+mo)?2k/2modmo,這里a-b需要加一個mo保證他是正數(shù),因為對負(fù)數(shù)取模還是負(fù)數(shù),我在這里卡了好幾發(fā)。如果k是偶數(shù)就是ak/2modmobk/2modmoa^{k/2}\mod mo b^{k/2}\mod moak/2modmobk/2modmo就好了,用個快速冪就好了。 AC代碼:
#include<bits/stdc++.h>#definelllonglongusingnamespace std;const ll mo =998244353;
ll qpow(ll a, ll n,ll m){ll ans =1;while(n){if(n&1){ans = a * ans % m;}a = a * a % m;n >>=1;}return ans;}voidsolve(){ll a, b, k;scanf("%lld%lld%lld",&a,&b,&k);ll x =qpow(2,k/2,mo);ll ans1, ans2;if(k%2){ans1 =(a+b)%mo*x%mo;ans2 =(a-b+mo)%mo*x%mo;printf("%lld %lld",ans1,ans2);}else{ans1 = a%mo*x%mo;ans2 = b%mo*x%mo;printf("%lld %lld",ans1,ans2);}}intmain(){// freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout);int t;scanf("%d",&t);for(int i =1;i <= t;i++){solve();printf("\n");}return0;}
1002 隨機(jī)題意 思維
題目地址1002 隨機(jī)題意 題意:給一個整數(shù)數(shù)組 a1,a2,?,an 和 k ,你想要找到一個最大的值 x ,使得存在另一個整數(shù)數(shù)組 b1,b2,?,bn 滿足 |ai?bi|≤k(1≤i≤n) 且 bn 中共有 x 個不同的數(shù)。 思路:給定k值后,每給一個數(shù),對應(yīng)的b值都有一個取值范圍,[ai-k,ai+k],把所有區(qū)間并到一起求區(qū)間長度就可以了。 AC代碼:
/*
** Author:
** Time:
** function:
*/#include<bits/stdc++.h>#definelllonglongusingnamespace std;structqujian{int l,r;booloperator<(const qujian& a)const{return l > a.l;}};voidsolve(){int n, k;cin >> n >> k;priority_queue<qujian> pqq;vector<qujian> vq;for(int i =1;i <= n;i++){int a;qujian q;cin >> a;q.l = a - k;q.r = a + k;pqq.push(q);}for(int i =1;i <= n;i++){qujian q1 = pqq.top();pqq.pop();if(pqq.empty()){vq.push_back(q1);break;}else{qujian q2 = pqq.top();if(q1.r >= q2.l){q1.r = q2.r;pqq.pop();pqq.push(q1);}else{vq.push_back(q1);}}}ll ans =0;for(int i =0;i < vq.size();i++){ans += vq[i].r-vq[i].l+1;}if(ans > n){cout << n << endl;}elsecout << ans << endl;}intmain(){// freopen("in.txt","r",stdin);// freopen("out.txt","w",stdout);cin.sync_with_stdio(0);cin.tie(0);int t;cin >> t;while(t--){solve();}return0;}