zoukankan      html  css  js  c++  java
  • [AT2384] [agc015_f] Kenus the Ancient Greek

    题目链接

    AtCoder:https://agc015.contest.atcoder.jp/tasks/agc015_f

    洛谷:https://www.luogu.org/problemnew/show/AT2384

    Solution

    神仙结论题...窝只会打表找规律...

    我们定义(f(i,j))表示((i,j))( m Euclidean step count),也就是走多少步那个玩意。

    定义(Fib(n)​)表示斐波那契数列第(n​)项,其中(Fib(0)=Fib(1)=1​)

    有一个比较显然(好找出规律)的结论:(f(Fib(x),Fib(x+1))=x​),且不存在任意((i,j)​)满足(f(i,j)geqslant x,i< Fib(x),j< Fib(x+1)​),这个由(打表)数学归纳可得。

    我们定义一个二元组((x,y)​)是好的,当且仅当不存在((i,j)​)满足(i<x,j<y,f(i,j)>f(x,y)​),显然只有好的二元组能贡献答案。

    我们定义一个二元组((x,y)​)是优秀的,当且仅当(x,yleqslant Fib(v+2)+Fib(v-1)​),其中(v=f(x,y)​)

    那么有一个结论:一个好的二元组进行一次( m Euclidean step​)之后一定为一个优秀的二元组,证明如下:

    我们考虑反证法证明,设好的二元组为((a,b)=(y,py+x))满足(xleqslant y,f(x,y)=v+1),优秀的二元组为((x,y)),假设(y> Fib(v+2)+Fib(v-1))

    可得:(a=y>Fib(v+2),b=py+xgeqslant x+y>Fib(v)+F(v+2)+Fib(v-1)=Fib(v+3))

    注意到(f(Fib(v+2),Fib(v+3))=v+2>f(a,b)),即存在((a',b'))满足(a'>a,b'>b)(f(a',b')>f(a,b)),与((a,b))是好的二元组矛盾。

    打表可知优秀的二元组并不多,貌似是(O(log^2 n)​)级别?我也不是特别清楚,所以我们可以把所有的优秀的二元组预处理出来,然后求答案就好了。

    复杂度可能是(O(qlog n)​)...

    #include<bits/stdc++.h>
    using namespace std;
    
    #define int long long 
    
    void read(int &x) {
        x=0;int f=1;char ch=getchar();
        for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
        for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
    }
    
    void print(int x) {
        if(x<0) putchar('-'),x=-x;
        if(!x) return ;print(x/10),putchar(x%10+48);
    }
    void write(int x) {if(!x) putchar('0');else print(x);putchar('
    ');}
    
    #define lf double
    #define ll long long 
    
    const int maxn = 110;
    const int inf = 1e9;
    const lf eps = 1e-8;
    const int mod = 1e9+7;
    
    #define pii pair<int,int >
    #define fr first
    #define sc second
    
    #define vec vector<pii >
    #define mp make_pair
    #define pb push_back
    
    #define iter vector <pii > :: iterator
    
    vec t[maxn];
    int n,m,q,f[maxn];
    
    signed main() {
        t[1].pb(mp(1,2)),t[1].pb(mp(1,3)),t[1].pb(mp(1,4));
        f[0]=f[1]=1;for(int i=2;i<=100;i++) f[i]=f[i-1]+f[i-2];
        for(int i=1;i<=100;i++) 
            for(int j=0,l=t[i].size()-1;j<=l;j++) {
                int x=t[i][j].sc,y=t[i][j].fr+x;
                while(y<=f[i+3]+f[i]) t[i+1].pb(mp(x,y)),y+=x;
            }read(q);
        for(int i=1;i<=q;i++) {
            read(n),read(m);if(n>m) swap(n,m);
            int p=1,ans=0;
            while(f[p+1]<=n&&f[p+2]<=m) p++;
            printf("%lld ",p);
            if(p==1) {write(n%mod*m%mod);continue;}
            for(int j=0,l=t[p-1].size()-1;j<=l;j++) {
                int x=t[p-1][j].fr,y=t[p-1][j].sc;
                if(y<=n) ans=(ans+(m-x)/y)%mod;
                if(y<=m) ans=(ans+(n-x)/y)%mod;
            }write(ans);
        }
        return 0;
    }
    
  • 相关阅读:
    ASP.NET3.5 企业级项目开发 -- 第一章(续):企业级项目框架解决方案的提出
    ASP.NET安全问题--Forms验证(后篇)--实战篇
    ASP.NET安全问题--Froms验证的具体介绍(中篇)
    ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出
    ASP.NET3.5 企业级项目开发
    ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发
    通过js的学习谈谈学习方法
    转载:LINQ to SQL更新数据库操作
    通用分页存储过程真的有注入漏洞吗?
    [MOSS开发]:webpart在部署时应该注意的地方
  • 原文地址:https://www.cnblogs.com/hbyer/p/10725582.html
Copyright © 2011-2022 走看看