小去世:我正在看着视频吃着饭,突然队群里来了句:“zwt大人起床了吗。”
赛前直接被迫犯罪。
先说一下总体体验:非常差。
看了各方言论,感觉也不能把锅直接甩给HDOJ,东部枢纽罪不至此。但是写题半小时提交半小时查记录半小时体验实在实在是太差了。
队里写完AFI三道签到题其实优势很大,可惜自己拉了跨。
A - Cut The Wire
签中签,可惜手慢20+分钟才核对完submit还被网站恶心()。奇数答案((n-1)/3 leq x leq n),偶数答案((n+1) leq x leq 2n),记得细节处理两端奇偶即可。
#include<bits/stdc++.h> #define fast ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define ll long long #define pb push_back using namespace std; const int maxn = 1e5+10; int main() { fast; int T; cin>>T; while(T--) { ll n; cin>>n; ll tmp1=(n-1)/3; tmp1++; ll sum1=(n-tmp1),sum2=(n-1); sum2=sum2/2; sum2++; if(tmp1%2+n%2==0) sum1=sum1/2; else sum1=sum1/2+1; //cout<<sum1<<' '<<sum2<<' '; cout<<sum1+sum2<<' '; } }
I - Command Sequence
队友开的题,简单地说一下,利用map分别记录每个点经过的次数(x),每个点的次数所带来的贡献为(x*(x-1)/2)。
F - Power Sum
当时看到平方数就想到去要做差,这样可以稳定凑到一个4,随后就是凑得模4后的余数。(1=1),(2=1-4-9+16),(3=-1+4) ,这样就可以凑得我想要的任意一个数,且保证(k leq n+2)。
#include<bits/stdc++.h> #define fast ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define ll long long #define pb push_back using namespace std; const int maxn = 1e5+10; int main() { fast; int T; cin>>T; int cnt=0; while(T--) { cnt=0; int n; cin>>n; if(n%4==0) cout<<n<<' '; if(n%4==1) cout<<n<<' ',cout<<"1",n-=1; if(n%4==2) cout<<n+2<<' ',cout<<"0001",n-=2; if(n%4==3) cout<<n-1<<' ',cout<<"01",n-=3; for(int i=1;i<=n/4;i++) { cout<<"1001"; } cout<<' '; } }
G - Function
我连参与都没参与,我是菜狗,队友真强。
L - Remove
一直WA,最后发现自己思路是错的。
原本想的是,记最大质数为(x),以(x leq i leq 2*x-1)这个区间为例,对于每一个不是最大质数的每一个质数,找到(p[j]-2*x \% p[j])的最大值(余数为0视为余数为(p[j])),在这个最大值前的部分答案等于(x)时的答案,后面部分(+1),每次遇到最大质数的倍数无条件(+1)。
小去世:昨天写完上面那个公式没仔细看,Latex写烂了。(其实是根本不会Latex)
思路完全来自于官方题解,并且T了,遗憾离场,先放着吧。
(i geq lcm(P))时无解,这个很显然,没有办法从最小公倍数往下走了。
在有解的情况下,答案非递减,这个算两个也能发现。(而且上面的思路也很明显地发现是非递减的)
对于任意一个(x),存在一个因子(p),则它的转移区间为([x+1,x+p-1]),那么我的最优选择是找到最大的因子。
由于给的都是素数,所以写了个像埃筛的东西标记每个数的最大素因子。
接下来是求助时间:
#include<bits/stdc++.h> #define fast ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define ll long long #define pb push_back using namespace std; const int maxn = 2e6+10; const int maxm = 1e5+10; ll a[maxn]; ll p[maxm]; ll f[maxn]; ll maxx=0; ll Lcm; ll n,m; __int128 cur[maxn]; const __int128 mod = pow(2,64); void init1() { cur[0]=1; for(int i=1;i<=2e6;i++) { cur[i]=cur[i-1]*23333%mod; } } void init2(ll x) { for(int i=1;i<=m;i++) { f[p[i]]=p[i]; } for(int i=1;i<=m;i++) { for(int j=p[i];j<x;j+=p[i]) { f[j]=max(f[j],p[i]); } } } void Print(__int128 x) { if (x < 0) cout<<'-', x = -x; if (x > 9) Print(x / 10); cout<<(char)(x%10+48); } void print(ll x) { __int128 ans=0; for(int i=1;i<=x;i++) { ans=(ans+a[i]*cur[x-i])%mod; } Print(ans); cout<<' '; } int main() { fast; init1(); int T; cin>>T; while(T--) { Lcm=1; int flag=1; maxx=0; cin>>n>>m; for(int i=1;i<=n;i++) { f[i]=1; a[i]=1e9; } for(int i=1;i<=m;i++) { cin>>p[i]; maxx=max(maxx,p[i]); if(flag) { Lcm*=p[i]; if(Lcm>n) { Lcm=n+1; flag=0; } } } init2(Lcm); for(int i=1;i<maxx;i++) { a[i]=1; } for(int i=1;i<Lcm;i++) { if(f[i]==1) continue; for(int j=i+1;j<=min(Lcm-1,i+f[i]-1);j++) { //cout<<i<<' '<<j<<' '; a[j]=min(a[j],a[i]+1); } } for(int i=Lcm;i<=n;i++) a[i]=0; print(n); // for(int i=1;i<=n;i++) // { // cout<<a[i]<<" "; // } // cout<<' '; } }
不知道有什么优化的点,咣咣咣给爹们磕头了。