Codeforces Round #282 (Div. 2) B. Modular Equations&C. Treasure

B. Modular Equations

题意:给一对a、b (0<a,b<10^9); 求满足 a mod x =b 的x有多少,若无限则print "infinity" (without the quotes)。

题解:a这么大优化地枚举吧;由于a-b=i*x 看来枚举到sqrt(a-b)就够了;

这题做记录只想对自己说:你敢有多粗心,系统就敢有多少罚时!!

#define INF 0x7fffffff
#define eps (1e-9)
#define mid 250
#define maxn 1000000000
#define clearto(s,x) memset(s,x,sizeof(s))
using namespace std;

int n, m, tot=0;

int main()
{
    //freopen("E:\DATA.txt","r",stdin);
    //int TT=1,tt+=1;            scanf("%d",&TT);
    int i=0,j=0,s=0,t=0;
    int a,b;
    scanf("%d%d",&a,&b);
    int ans=0;
    if(a==b)        {   printf("infinity");  return 0;  }
    if(a==0||a< b)  {   printf("0");  return 0;   }          // a==0 真的是很特殊情况啊
    n= a-b;   m=sqrt(a-b);
    for(i=1;i<=m;i++){
        if(n%i)         continue;               
        if(i> b)        ans++;
        if((n/i >b)&&(i*i!=n))    ans++;
    }
    printf("%d",ans);
    return 0;
}

C. Treasure

题意:There was a string s written on the door consisting of characters '(', ')' and '#'. 用一个或多个‘)’代替‘#’ 使得S是beautiful;就是最终左右括号个数相等,且从左往右任何时候')'不超过'('数量

就感慨一下   挖掘题目中的性质真是太重要了;就我那一开始就傻瓜式的模拟,作死;

题解:如果能替换成功,则可以前面#多于1的替换都放到最后一个# ;运用这性质随便替换一下,再随随便检查一下就OK了。

#define INF 0x7fffffff
#define eps (1e-9)
#define lenq 2<<16
#define maxn 199999999
#define clearto(s,x) memset(s,x,sizeof(s))
using namespace std;

int n, m, tot=0;
int val[100005];
char dic[100005];

int main()
{
    //freopen("E:\DATA.txt","r",stdin);
    //int TT=1,tt=1;         scanf("%d",&TT);
    int i=0,j=0,k=0,t=0;     clearto(val,0);
    scanf("%s",dic);
    int len=strlen(dic);
    int sum=0,id=0;
    for(i=0;i<len;i++)       //先找找缺多少个‘)’和最后一个#位置
    {
        if(dic[i]=='(') { val[i]= 1;  sum++;  }
        if(dic[i]==')') { val[i]=-1;  sum--;  }
        if(dic[i]=='#') {
           val[i]=-1;     id=max(id,i);  sum--;  tot++;
        }
    }
    if(sum<0) { printf("-1");    return 0; }
    val[id]=val[id]-sum;         sum=0;
    for(i=0;i<len;i++)           //  完了检查一下
    {
        sum=sum+val[i];
        if(sum<0) { printf("-1");     return 0; }
    }
    for(i=1;i<=tot;i++){
       if(i!=tot)  printf("1\n");
       else        printf("%d",-val[id]);
    }
    return 0;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值