机房测试10.6

砖块

很简单的水题,写起来也很简单。

模拟写的很短,是否也是码力的体现?

#include<cstdio>
#include<cstring>
#include<map>
#define FN "block"

int mp[1105][1105],dao,ans;
char s[105];
int x,y,dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
std::map<char,int> m;

void init() {
    memset(mp,0,sizeof(mp));
    mp[550][550]=1;
    ans=x=y=0;
    dao=-1;
}

int main() {
    freopen(FN".in","r",stdin);
    freopen(FN".out","w",stdout);
    m[‘N‘]=0,m[‘S‘]=1,m[‘W‘]=2,m[‘E‘]=3;
    int T;scanf("%d",&T);
    while(T--) {
        init();
        int k;scanf("%d",&k);
        scanf("%s",s+1);
        int len=strlen(s+1);
        for(int i=1;i<=len;i++) {
            x+=dx[m[s[i]]];
            y+=dy[m[s[i]]];
            if(!~dao) {
                 for(int j=0;j<k;j++)
                     if(++mp[x+dx[m[s[i]]]*j+550][y+dy[m[s[i]]]*j+550]>ans)
                         ans=mp[x+dx[m[s[i]]]*j+550][y+dy[m[s[i]]]*j+550];
                 dao=m[s[i]];
            }
            else if((dao^m[s[i]])==1) {
                if(++mp[x+550][y+550]>ans) ans=mp[x+550][y+550];
                dao=-1;
            }
            else if(dao==m[s[i]]) {
                x+=dx[m[s[i]]]*(k-1),y+=dy[m[s[i]]]*(k-1);
                if(++mp[x+550][y+550]>ans) ans=mp[x+550][y+550];
                dao=-1;
            }
            else {
                for(int j=0;j<k;j++)
                    if(++mp[x+dx[dao]*j+550][y+dy[dao]*j+550]>ans)
                        ans=mp[x+dx[dao]*j+550][y+dy[dao]*j+550];
            }
        }
        if(!~dao) printf("%d\n%d\n",x,y);
        else if(dao==0 || dao==3) {
            for(int j=0;j<k;j++) printf("%d%c",x+dx[dao]*j,j==k-1?‘\n‘:‘ ‘);
            for(int j=0;j<k;j++) printf("%d%c",y+dy[dao]*j,j==k-1?‘\n‘:‘ ‘);
        }
        else {
            for(int j=k-1;j>=0;j--) printf("%d%c",x+dx[dao]*j,j?‘ ‘:‘\n‘);
            for(int j=k-1;j>=0;j--) printf("%d%c",y+dy[dao]*j,j?‘ ‘:‘\n‘);
        }
        printf("%d\n",ans);
    }
    return 0;
}

可以不用map,但是我懒得改了。

翻转有好几种情况,只要去想,还是不会漏的(如果漏了过不了样例)

数字

真的堪称神仙题,题解至今没有看懂。

威尔逊定理加上balabala可以解决\(k=1\)的情况。

预处理1e7阶乘%1e7可以50分,%1e5只有20分。

std的代码(有高精度):

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;

const int con=100000000;
const int wei=8;
class Int{
public:long long a[100];
  void read(){
    memset(a,0,sizeof(a));
    char S[105]={0}; int len=0;
    scanf("%s",S+1); len=strlen(S+1);
    for (int i=1;i<=len/2;i++) swap(S[i],S[len-i+1]);
    for (int i=1;i<=len;i++) S[i]-=‘0‘;
    a[0]=0;
    for (int i=1;i<=len;i+=8){
      a[0]++;
      for (int j=i+7;j>=i;j--)
    a[a[0]]=a[a[0]]*10+S[j];
    }
  }
  void getdata(int x){memset(a,0,sizeof(a));while (x){a[++a[0]]=x%con;x=x/con;}}
  Int(int x=0){
    getdata(x);
  }
  void pri(bool flag){
    if (a[0]==0||(a[0]==1&&a[1]==0)){printf("0");if (flag)printf("\n");return;}
    printf("%lld",a[a[0]]);
    for (int i=a[0]-1;i;i--)
      printf("%08lld",a[i]);
    if (flag)printf("\n");
  }
  bool operator <(const Int &X){
    if (a[0]<X.a[0])return true;if (a[0]>X.a[0])return false;
    for (int i=a[0];i;i--){if (a[i]<X.a[i])return true;if (a[i]>X.a[i])return false;}
    return false;
  }
  bool operator >(const Int &X){
    if (a[0]<X.a[0])return false;if (a[0]>X.a[0])return true;
    for (int i=a[0];i;i--){if (a[i]<X.a[i])return false;if (a[i]>X.a[i])return true;}
    return false;
  }
  bool operator <=(const Int &X){
    if (a[0]<X.a[0])return true;if (a[0]>X.a[0])return false;
    for (int i=a[0];i;i--){if (a[i]<X.a[i])return true;if (a[i]>X.a[i])return false;}
    return true;
  }
  bool operator >=(const Int &X){
    if (a[0]<X.a[0])return false;if (a[0]>X.a[0])return true;
    for (int i=a[0];i;i--){if (a[i]<X.a[i])return false;if (a[i]>X.a[i])return true;}
    return true;
  }
  bool operator ==(const Int &X){
    if (a[0]!=X.a[0])return false;for (int i=a[0];i;i--)if (a[i]!=X.a[i])return false;
    return true;
  }
  Int operator +(const Int &X){
    Int c;memset(c.a,0,sizeof(c.a));
    for (int i=1;i<=a[0]||i<=X.a[0];i++)
      {c.a[i]=c.a[i]+a[i]+X.a[i];c.a[i+1]+=c.a[i]/con;c.a[i]%=con;}
    c.a[0]=max(a[0],X.a[0]);if (c.a[c.a[0]+1])c.a[0]++;
    return c;
  }
  Int operator +(int num){
    Int c;memcpy(c.a,a,sizeof(c.a));c.a[1]+=num;
    for (int i=1;i<=c.a[0]&&c.a[i]>=con;i++)c.a[i]-=con,c.a[i+1]++;
    while (c.a[c.a[0]+1])c.a[0]++;
    return c;
  }
  Int operator -(const Int &X){
    Int c;memcpy(c.a,a,sizeof(c.a));
    for (int i=1;i<=a[0];i++){c.a[i]=c.a[i]-X.a[i];if (c.a[i]<0){c.a[i+1]--;c.a[i]+=con;}}
    while (c.a[0]&&!c.a[c.a[0]])c.a[0]--;
    return c;
  }
  Int operator -(int num){
    Int c;memcpy(c.a,a,sizeof(c.a));c.a[1]-=num;
    for (int i=1;i<=c.a[0]&&c.a[i]<0;i++)c.a[i]+=con,c.a[i+1]--;
    while (c.a[0]&&!c.a[c.a[0]])c.a[0]--;
    return c;
  }
  Int operator *(const Int &X){
    Int c;memset(c.a,0,sizeof(c.a));
    for (int i=1;i<=a[0];i++)for (int j=1;j<=X.a[0];j++)
                   {c.a[i+j-1]+=a[i]*X.a[j];c.a[i+j]+=c.a[i+j-1]/con;c.a[i+j-1]%=con;}
    c.a[0]=max(a[0]+X.a[0]-1,0ll);if (c.a[a[0]+X.a[0]]>0)c.a[0]++;
    return c;
  }
  Int operator *(int num){
    Int c;memset(c.a,0,sizeof(c.a));
    for (int i=1;i<=a[0];i++){c.a[i]+=a[i]*num;if (c.a[i]>=con){c.a[i+1]+=c.a[i]/con;c.a[i]%=con;}}
    c.a[0]=a[0];if (c.a[c.a[0]+1]>0)c.a[0]++;
    return c;
  }
  Int operator /(int num){
    Int c;memset(c.a,0,sizeof(c.a));
    long long x=0;for (int i=a[0];i;i--){x=x*con+a[i];c.a[i]=x/num;x=x%num;}
    c.a[0]=a[0];if (c.a[0]&&!c.a[c.a[0]])c.a[0]--;
    return c;
  }
  int operator %(int num){
    int ret=0;
    for (int i=a[0];i;i--)
      ret=((ll)ret*con+a[i])%num;
    return ret;
  }
};

inline int Pow(int a,int b,int p){
  int ret=1;
  for (int i=1;i<=b;i++) ret=ret*a%p;
  return ret;
}

Int N,K,K0;
int k;
int S[1005],m;

inline void Pre(){
  Int t=N; K0.getdata(0);
  while (!(t==0)) K0=K0+t/5,t=t/5;
}

int ans[200][200];
int a[200];

inline int Solve(){
  int phi=k==1?4:(k==2?4*5:4*5*5);
  int mod2=0,mod5,k2=Pow(2,k,2333),k5=Pow(5,k,2333);
  for (int i=0;i<k2*k5;i++) ans[i%k2][i%k5]=i;
  int inv=Pow(2,phi-1,k5),Inv=Pow(inv,K0%phi,k5);

  a[0]=1;
  for (int i=1;i<k5;i++){
    int t=i; if (t%5==0) t=1;
    a[i]=(a[i-1]*t)%k5;
  }

  Int T=N; mod5=1;
  while (!(T==0)){
    mod5=mod5*Pow(a[k5-1],(T/k5)%phi,k5)%k5;
    mod5=mod5*a[T%k5]%k5;
    T=T/5;
  }

  mod5=mod5*Inv%k5;

  return ans[mod2][mod5];
}

inline void print(long long t,int k){
  if (k==1)
    printf("%lld\n",t%10);
  else if (k==2)
    printf("%02lld\n",t%100);
  else if (k==3)
    printf("%03lld\n",t%1000);
}

int main(){
  freopen("num.in","r",stdin);
  freopen("num.out","w",stdout);
  int T;
  scanf("%d",&T);
  while (T--){
    N.read();
    scanf("%d",&k);
    if (N<=15){
      long long t=1;
      for (int i=1;Int(i)<=N;i++) t*=i;
      while (t%10==0) t/=10;
      print(t,k);
    }else{
      Pre(); print(Solve(),k);
    }
  }
  return 0;
}

不写高精度有80分,但至今不知怎么做。

暴力分给足了的。

因为合法的顺序对应序列是唯一的,于是进行Hash,操作后如果对它所有操作的Hash值与正确的相同,那么就正确了。

所以用两个Tag的线段树维护Hash值的加法和乘法。

std写的很妙,我学习了一波。

#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
typedef unsigned int uint;

inline char nc(){
  static char buf[100000],*p1=buf,*p2=buf;
  return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline void read(int &x){
  char c=nc(),b=1;
  for (;!(c>=‘0‘ && c<=‘9‘);c=nc()) if (c==‘-‘) b=-1;
  for (x=0;c>=‘0‘ && c<=‘9‘;x=x*10+c-‘0‘,c=nc()); x*=b;
}

const int N=200005;
const uint seed=233333;
struct abcd{
  uint a,b;
  abcd(uint a=1,uint b=0):a(a),b(b) { }
  bool one() { return a==1 && b==0; }
  void add(abcd B){
    uint _a=a,_b=b;
    a=B.a*_a; b=B.a*_b+B.b;
  }
}T[N<<2];

inline void modify(int x,int l,int r,int ql,int qr,abcd t){
  if (ql<=l && r<=qr){
    T[x].add(t);
    return;
  }
  if (!T[x].one())
    T[x<<1].add(T[x]),T[x<<1|1].add(T[x]),T[x]=abcd();
  int mid=(l+r)>>1;
  if (ql<=mid) modify(x<<1,l,mid,ql,qr,t);
  if (qr>mid) modify(x<<1|1,mid+1,r,ql,qr,t);
}
uint Hash[N];
inline void query(int x,int l,int r){
  if (l==r){
    Hash[l]=T[x].b;
    return;
  }
  if (!T[x].one())
    T[x<<1].add(T[x]),T[x<<1|1].add(T[x]),T[x]=abcd();
  int mid=(l+r)>>1;
  query(x<<1,l,mid);
  query(x<<1|1,mid+1,r);
}

int n,K;

int main(){
  int T,l,r,x;
  freopen("deco.in","r",stdin);
  freopen("deco.out","w",stdout);
  read(n); read(K);
  read(T);
  while (T--){
    read(l); read(r); read(x);
    modify(1,1,n,l,r,abcd(seed,x));
  }

  query(1,1,n);
  uint h=0;
  for (int i=1;i<=K;i++) h=h*seed+i;
  int ans=0;
  for (int i=1;i<=n;i++)
    if (Hash[i]==h)
      ans++;
  printf("%d\n",ans);
  return 0;
}

用结构体存两个Tag,用构造函数运算出值。

妙啊~

原文地址:https://www.cnblogs.com/LoLiK/p/9750546.html

时间: 2024-09-30 06:13:44

机房测试10.6的相关文章

Host1Plus主机商8个机房测试IP体验

Host1Plus商家也算是比较老的海外主机商(英国),当初进入中国市场也是比较早的,记得那时候支持支付宝的海外主机商尤其的深受用户喜欢.因为我 们大部分网友.站长最多有一个支付宝,很少有双币信用卡或者贝宝支付美元的能力.不过后来几年,HOST1PLUS商家逐渐的落寞,主要原因在于其他商家 的出现,以及他们本身营销能力和产品的策略. 尤其是提供的虚拟主机和VPS主机,价格和方案不是太符合中国用户的口味,配置比较低,而且机房较 少.不过商家应该意识到这一点,在最近2年改动挺大的,今天公司业务正好有

APP测试10点

1.安装和卸载●应用是否可以在IOS不同系统版本或android不同系统版本上安装(有的系统版本过低,应用不能适配)●软件安装后是否可以正常运行,安装后的文件夹及文件是否可以写到指定的目录里.●安装过程中是否可以取消●安装空间不足时是否有相应提示●如果应用需要通过网络验证之类的安装,需要测试一下断网情况下是否有相应提示●是否可以删除应用(可通过桌面删除,也可以通过软件卸载安装.曾发现在IOS手相上有个应用安装时未完全安装,终止安装后,未完成安装的应用图标一直显示在手机上,并且无法成功删除)●测试

ORM框架示例及访问测试(10种框架)

继上次ORM之殇,我们需要什么样的ORM框架? 整理了10个ORM框架测试示例,排名不分先后 CRL EF PDF XCODE NHibernate MySoft Moon Cyq Dapper IBatisNet 上面的框架里,风格不一,多数为半对象化,需要以参数形式传值,效率可能高点,但编程性和便捷性就会差点 目的 测试ORM数据访问性能,比较简单粗暴,统计对象映射转换和返回时间,(纯对象化的ORM用时会比用参数形式的ORM长) ORM开发调用实现方式,不同ORM开发风格和便捷性一目了然 测

[20191004机房测试] ZGY的早餐

ZGY 每天早上要从宿舍走路到机房,顺便从学校小卖部购买早饭,当然机智的 ZGY 一定会走最短路 学校的路可以看成一无向联通张图,图上有 n 个点,m 条边,每一个点都有一个唯一的编号 1~n 每一条边有一个边权,表示两个点之间的距离,ZGY 的宿舍在 S 点,机房在 T点,而小卖部在 H 点 现在 ZGY 想知道从宿舍经过小卖部到达机房的最短距离 不过因为在这个世界上有 Q个 ZGY,所以你必须回答 Q 个问题 很棒的数据分治题 读入里面说了会读入测试点编号-- 其实是很明显的暗示了-- 一半

Hyper-V虚拟化测试10测试故障转移

5.3.测试故障转移Hyper-V也提供了一个测试故障转移的测试方案,故障转移测试并非真正的实现故障转移,Hyper-V只是在我们的副本服务创建一个快照出来,是一个Hyper-V内置的测试方法,通过此方法,可以了解虚拟机的复制状态和有效性. 首先,找到需要复制测试的虚拟机,在主服务器上,查看下服务器的配置和信息,方便后续故障转移测试时查看信息用.这里创建了一个文本文件,然后看看服务器IP地址信息,如下:文本信息 IP地址信息 下面回到我们的副本服务器上,右键à复制à测试故障转移 因之前我们选择复

机房测试9.23

题解之前 今天还行啊. Set 肯定要取模. 开始还在想vector这种操作,后来一个dalao发现一定有解,然后有发现一定有一种答案是连续的一段区间,于是就切掉了. 看了题解才发现我们只是运气好. 前缀和如果有n取值,就选%n=0的那一个,不然至多只剩n-1个取值,然而又有n个前缀和. 所以必然有两个相等,输出这之间的下标即可. #include<cstdio> #include<cctype> #include<cstring> #define FN "s

[20191003机房测试] 太阳神

太阳神拉很喜欢最小公倍数,有一天他想到了一个关于最小公倍数的题目 求满足如下条件的数对(a,b)对数: a,b 均为正整数且 a,b<=n 而lcm(a,b)>n 其中的 lcm 当然表示最小公倍数 答案对 1,000,000,007取模 数据范围是1e10的,打表找了半天规律发现没用-- 那就莫比乌斯反演呗 题目求: \[\sum_{i=1}^{n}\sum_{j=1}^{n}[lcm(i,j)> n]\] 但是大于的太多了,那我们就反过来求,最后用总的来减 也就是求: \[\sum_

[20191003机房测试] 天空龙

奥西里斯之天空龙很喜欢颜色,有一天他找到了三种颜色--红黄蓝 奥西里斯有 a 个红色,b 个黄色,c 个蓝色,他想画出最好的画, 可是需要至少 x 个红色,y 个黄色和 z 个蓝色,似乎并不够. 别担心,奥西里斯会魔法! 他可以把任何两个同种颜色转化为一个另一种颜色! 请问他能不能完成呢? 这题目描述让我感受到面对机翻的恐惧-- 这又不是外语翻译过来的啊喂!什么语文水平? 很显然,如果有多余的颜色,把它们分别÷2,就是可以转换的数量 然后再与差的颜色比较,得出答案 代码: #include<bi

机房测试2:home(tarjan求必经点)

题目: 求一张无向图从1走到N的必经点 n<=2e5   m<=4e5 分析: 必经点意为:删除后整个图不连通,但不能直接求割点.因为删掉的那个点可以使图不连通,但不能保证1与n不连通. 所以要删的是在1到n路径上的点.也就是说,删掉的点能使1和n隔开. 法1: tarjan判环的时候从1开始,并维护一个数组siz[v]:表示v这个点在搜索树中的子树里有没有n这个点,每一次回溯的时候将标记回传给u(u是v的father). 在判割点的条件:low[v]<=dfn[u](u的子树不能到达比