码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj 1407 [Noi2002]Savage

时间:2018-07-01 22:00:25      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:题目   枚举   targe   cstring   string   lag   strong   bsp   不能   

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1407

因为答案有很小的限制,所以可以枚举。(听说不能二分?)

T*p[ i ] + c[ i ] = T*p[ j ] + c[ j ](mod m)

<==>T*(p[ i ] - p[ j ]) + k * m = c[ j ] - c[ i ]

然后需要打一个正确的板子。

放一点笔记:

exgcd有解,仅当得数是gcd的倍数。这样可以求出特解后同乘一个数得到解。
ax+by=c的通解:ax1+by1=c;ax2+by2=c;  ->  a(x1-x2)+b(y1-y2)=0;  ->  a*del(x)+b*del(y)=0
        把a和b都除以它们的gcd,得a0*del(x)+b0*del(y)=0;
        因为互质,所以最小的del(x)=-b0 , del(y)=a0。

特别奇怪的是如果不判 if (b<0) b = -b 就会WA。可是b什么时候会变成负数呢?

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=20,M=1e6;
int n,m,c[N],p[N],l[N],x,y;
bool flag;
int gcd(int a,int b){return b?gcd(b,a%b):a;}
void exgcd(int a,int b)
{
    if(!b){x=1;y=0;return;}
    exgcd(b,a%b);
    int tx=x;
    x=y;y=tx-a/b*y;
}
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d%d%d",&c[i],&p[i],&l[i]),m=max(m,c[i]);//
    for(;m<=M;m++)
    {
        flag=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                int a=p[i]-p[j],b=m,w=c[j]-c[i],g=gcd(a,b);
                if(w%g)continue;
                a/=g;b/=g;w/=g;//
                if(b<0)b=-b;    //
                exgcd(a,b);
                x=(x*w%b+b)%b;//*w,解出来的东西对应得数是gcd,现在约了g,gcd=1,故同乘w 
                if(x<=min(l[i],l[j])){flag=1;break;}
            }
            if(flag)break;
        }
        if(!flag)
        {
            printf("%d",m);return 0;
        }
    }
}

 

bzoj 1407 [Noi2002]Savage

标签:题目   枚举   targe   cstring   string   lag   strong   bsp   不能   

原文地址:https://www.cnblogs.com/Narh/p/9251433.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!