ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

luogu P5285 [十二省联考2019]骗分过样例

2020-03-19 21:56:32  阅读:222  来源: 互联网

标签:过样 骗分 cnt ll long && include 联考 define


LINK:骗分过样例

这是去年省选的一道题答题 当时就拿了十几分 而且当时玩的很开心。

但是 很多点都没能拿到。

总共16个点 每个测试点都有自己的分值 这意味着我们将要写16个小程序把已经有的答案给输出出去。

第一个点 1_998244353 输入是100000个数字 输出 显然可以发现是19的若干次幂。

但是后面要取模 测试点提醒我们对 998244353取模即可。由于n<=30000 直接快速幂即可。

第二点同第一个点 不过输入再long long 范围考虑欧拉降幂 %(mod-1)即可。

第三个点同第一个点 不过输入是高精度 我们在输入的时候边读边取模即可。

第四个点 1? 这个点输入还是30000个数字 1后面多了问号 说明了模数没有了。

还是19的若干次幂 不过我们要先找到模数 可以暴力枚举 暴力计算 最后发现模数是 1145141

第五个点 1?+ 观察一下输出 发现答案很大 说明模数很大 达到了1e18的数量级。

不能再暴力枚举了(我傻了我暴力枚举。。 考虑约束一下我们的模数范围 两个很近的值 x y我们知道他们的答案 设x<y 那么我们能求出y的答案。

显然 模数为\(19^{y-x}ansx-ansy\)的约束 我们从小到大枚举一下约数计算一下即可 由于模数的数量级为1e18所以100以内的约数足以。

但是我们要先排序除了0~9的 在剩下数中找即可。(这个测试点就有点麻烦了。

可以发现我们最后 得到了一个7e20的数据 需要枚举因数 这要高精!。。int128好好写很多 关键时刻注意借助STL 真不行就放弃。

值得注意的是模数过大 龟速乘我知道,关键是加法爆long long 考虑开unsignedlonglong 即可。

//#include<bits/stdc++.h>
#include<iostream>
#include<cstring>
#include<string>
#include<ctime>
#include<cctype>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<stack>
#include<vector>
#include<deque>
#include<list>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#include<iomanip>
#define ll long long
#define db double
#define INF 1000000000
#define ld long double
#define pb push_back
#define get(x) x=read()
#define putl(x) printf("%lld\n",x)
#define gt(x) scanf("%d",&x)
#define put(x) printf("%d\n",x)
#define rep(p,n,i) for(RE ll i=p;i<=n;++i)
#define go(x) for(ll i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define pii pair<ll,ll> 
#define F first
#define S second
#define mk make_pair
#define RE register
#define mod 998244353
#define ull unsigned long long
using namespace std;
char *fs,*ft,buf[1<<15];
inline char getc()
{
    return (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<15,stdin),fs==ft))?0:*fs++;
}
inline ll read()
{
    RE ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
inline ll READ(ll p)
{
    RE ll x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10%p+ch-'0';ch=getchar();}
    return x*f;
}
const ll MAXN=100010;
char a[20],c[110];
ll n;
struct wy
{
    ll x,y;
    ll friend operator <(wy a,wy b){return a.x<b.x;}
}t[MAXN];
inline ll ksm(ll b,ll p,ll M)
{
    ll cnt=1;
    while(p)
    {
        if(p&1)cnt=cnt*b%M;
        b=b*b%M;p=p>>1;
    }
    return cnt;
}
inline ull gsc(ull a,ll b,ll M)
{
    ull cnt=0;
    while(b)
    {
        if(b&1)cnt=(cnt+a)%M;
        a=(a+a)%M;b=b>>1;
    }
    return cnt;
}
inline ll Ksm(ull b,ll p,ll M)
{
    ull cnt=1;
    while(p)
    {
        if(p&1)cnt=gsc(b,cnt,M);
        b=gsc(b,b,M);p=p>>1;
    }
    return cnt;
}
signed main()
{
    freopen("1.in","r",stdin);
    scanf("%s",a+1);
    if(a[1]=='1'&&a[2]=='_'&&a[3]=='9')
    {
        get(n);
        rep(1,n,i)
        {
            ll x=READ(mod-1);
            putl(ksm(19,x,mod));
        }
    }
    if(a[1]=='1'&&a[2]=='?'&&a[3]!='+')
    {
        get(n);
        /*read();read();read();
        scanf("%s",c+1);
        ll len=strlen(c+1);
        for(ll i=500000;;++i)
        {
            ll ans=0;
            rep(1,len,j)
            {
                ans=(ans*10+c[j]-'0')%(i-1);
            }
            if(ksm(19,ans,i)==642666){putl(i);return 0;}//i==1145141
        }*/
        rep(1,n,i)
        {
            ll x=READ(1145141-1);
            putl(ksm(19,x,1145141));
        }
    }
    if(a[1]=='1'&&a[2]=='?'&&a[3]=='+')
    {
        get(n);
        /*rep(1,n,i)get(t[i].x);
        rep(1,n,i)get(t[i].y);
        sort(t+1,t+n+1);
        ll L,R,minn=INF;
        rep(1,n,i)
        {
            if(i<=10)continue;
            if(t[i].x-t[i-1].x<minn)L=i,R=i-1,minn=t[i].x-t[i-1].x;
        }
        putl(L);putl(R);
        cout<<t[L].x<<' '<<t[L].y<<endl;
        cout<<t[R].x<<' '<<t[R].y<<endl;
        cout<<(long double)t[R].y*19*19-t[L].y<<endl;
        long double w=(long double)t[R].y*19*19-t[L].y;
        //枚举因数 可以得到mod=5211600617818708273;*/
        rep(1,n,i)
        {
            ll x=read();
            putl(Ksm(19,x,5211600617818708273ll));
        }
    }
    return 0;
}

标签:过样,骗分,cnt,ll,long,&&,include,联考,define
来源: https://www.cnblogs.com/chdy/p/12527445.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有