提交时间:2024-10-04 13:29:06

运行 ID: 33077

#include<bits/stdc++.h> using namespace std; #define ll long long #define PII pair<int,int> #define PFI pair<frac,int> #define fi first #define se second const int N=2e5+10; int n,m;ll k; ll gcd(ll a,ll b){ //cout<<a<<' '<<b<<endl; if(min(a,b)==0) return max(a,b); return gcd(min(a,b),max(a,b)%min(a,b)); } struct frac{ ll u,d; frac de(frac a){ ll g=gcd(a.u,a.d); a.u/=g;a.d/=g;return a; }frac operator*(const frac &b)const{ frac res;res.u=u*b.u;res.d=d*b.d; ll g=gcd(abs(res.u),abs(res.d)); res.u/=g;res.d/=g; return res; }frac operator+(const frac &b)const{ frac res;res.u=u*b.d+d*b.u;res.d=d*b.d; ll g=gcd(abs(res.u),abs(res.d)); res.u/=g;res.d/=g; return res; }bool operator<(const frac &b) const{ return u*b.d<d*b.u; } }; map<PII,int> ps; map<PFI,vector<int> > tps; map<PII,vector<int> > nps; bool cmp(int a,int b){ return a>b; } int mod(int a,int m){ m=abs(m); int tmp=abs(a)%m; if(a>=0) return tmp; if(a<0) return (m-tmp)%m; } int main(){ ll ans=0; string s;cin>>s;cin>>k; ps[make_pair(0,0)]=1; int nx=0,ny=0;//cout<<s.length(); for(int i=0;i<s.length();i++){ if(s[i]=='U') ny++; if(s[i]=='D') ny--; if(s[i]=='L') nx--; if(s[i]=='R') nx++; ps[make_pair(nx,ny)]=1; }if(k==1||(nx==0&&ny==0)){ cout<<ps.size(); }else{ if(nx==0){ for(auto it:ps) nps[make_pair(it.fi.fi,mod(it.fi.se,ny))].push_back(it.fi.se); vector<int> tmp; for(auto it:nps){ tmp.clear(); for(auto ed:it.se) tmp.push_back(ed); if(ny>0) sort(tmp.begin(),tmp.end()); else sort(tmp.begin(),tmp.end(),cmp); for(int i=1;i<tmp.size();i++){ int x=abs(tmp[i]-tmp[i-1]); ans+=min(1ll*x/abs(ny),k); }ans+=k; } }else if(ny==0){ for(auto it:ps) nps[make_pair(it.fi.se,mod(it.fi.fi,nx))].push_back(it.fi.fi); vector<int> tmp; for(auto it:nps){ tmp.clear();//cout<<it.fi.fi<<' '<<it.fi.se<<endl; for(auto ed:it.se) tmp.push_back(ed)/*,cout<<ed<<' '*/;//cout<<endl; if(nx>0) sort(tmp.begin(),tmp.end()); else sort(tmp.begin(),tmp.end(),cmp); //cout<<tmp.size()<<endl; for(int i=1;i<tmp.size();i++){ int x=abs(tmp[i]-tmp[i-1]); //cout<<x; ans+=min(1ll*x/abs(nx),k); }ans+=k; } }else{ for(auto it:ps){ frac res=(frac){it.fi.se,1}+((frac){ny,nx}*(frac){-it.fi.fi,1}); tps[make_pair(res,mod(it.fi.fi,nx))].push_back(it.fi.fi); }vector<int> tmp; for(auto it:tps){ tmp.clear(); for(auto ed:it.se) tmp.push_back(ed); if(nx>0) sort(tmp.begin(),tmp.end()); else sort(tmp.begin(),tmp.end(),cmp); for(int i=1;i<tmp.size();i++){ int x=abs(tmp[i]-tmp[i-1]); ans+=min(1ll*x/abs(nx),k); }ans+=k; } }cout<<ans; } return 0; }