• 十二省联考2019 骗分过样例


    十二省联考2019 骗分过样例


    1_998244353

    出题人的良心送肉点,前三个输入是1,2,3,输出是1,19,361,显然是19的n次方,模数就是给的998244353

    第三个点n有40位,看似要高精度其实按照读入优化方法读进来以后对(varphi(998244353)=998244352)取膜再快速幂就行了

    屎鸡还说要python真的呆

    1?

    998244353没了应该是要猜模数,那我就先读进所有答案取个最大值猜一下

    1145099

    那我一直往后试模数吧。。(py3自带快速幂还是很牛逼的)

    import sys,os,random
    fin=open("4.in")
    fans=open("4.ans")
    fin.readline()
    fin.readline()
    n=int(fin.readline())
    inputs=[]
    outputs=[]
    for i in range(n):
    	inputs.append(int(fin.readline()))
    	outputs.append(int(fans.readline()))
    Mod=1145099
    while 1:
    	Mod+=1
    	yes=1
    	for i in range(n):
    		if pow(19,inputs[i],Mod)!=outputs[i]:
    			yes=0
    			break
    	if yes:break
    print(Mod)
    
    $ python3 4.py
    1145141
    

    这模数牛逼

    1?+

    应该还是猜模数,同样方法求最大值,5211500658258874318

    好像跑一小会跑不出来啊,想一下怎么做呢。。

    然后就去膜题解了。。。

    有这样两组数据,

    264708066 1996649514996338529
    264708068 1589589654696467295
    


    x=264708066 a=1996649514996338529
    y=264708068 b=1589589654696467295

    那么(a imes 19^2equiv b(mod Mod))

    (Mod|(a imes 19^2-b))

    那么上一个单位根反演

    (Mod)必须是这个东西的约数而且(>5211500658258874318)

    先看看这个东西是(719200885258981741674=2 imes3 imes23 imes)。。。。怎么回事我质因数分解写挂了?

    剩下那个是(5211600617818708273),好像只比答案最大值大一点点,就是这个

    1wa_998244353

    果然WA了啊,stm还有负数,提示好像给了自然溢可能就是说这个的

    但是这里因为不知道怎么溢的,不能快速幂,就很鸡贼了

    又膜题解去了。。。

    stm用map找周期。。。佛了

    这个周期贼小啊,从n=55245到n=100944

    2p

    开新档啦。。。

    因为前面几个ans直接用gedit打开都没有问题,然后我打开了8.ans

    我电脑就卡死了。。。
    死了。。。
    了。。。

    (慌得直接打开9.ans)

    这输出字符串??完全看不懂啊,,,连长度都看不懂。。。

    看了一眼最后一个串的长度,(10^6)

    所以串长就是b-a+1了

    看到b-a+1很容易想到r-l+1?

    然后先看第一个

    1 2 3 4 5 6 7 8 9 10
    / p p . p . p . . .

    所以p应该就是质数的意思

    所以这题就是给一段区间求这些数是不是质数

    好像是miller_rabin裸题。。

    2u

    p是质数的意思,那么u是什么鬼。。。

    打开输入文件有+,-和0,那么应该是莫比乌斯函数

    然后膜题解去了

    对每个数先计算(10^6)以内的质因数,那么去掉这些以后这个数只有四种可能:1、质数、完全平方数和两个不同质数之积。这个就很好判了

    2g

    g就是判原根。

    根据以前的知识可以知道,对于质数(p),对(p-1)进行唯一分解,(p-1=prod p_i^{e_i}),那么(a)(p)的原根当且仅当对于每个(i)都有(a^{frac{p-1}{p_i}}mod p eq 1)

    那么第一个点(p=998244353)(p-1=998244352=2^{x}cdot 7cdot 17),只需要暴力就行了。

    第二个点(p=13123111)就很麻烦,发现(p-1=2cdot 3cdot 5cdot 7cdot 11cdot 13cdot 19cdot 23),但(p)不是很大,查询的范围是1-(p-1),可以预处理,对于这些因子的倍数,筛掉它,它不是(p)的原根。剩下的都是。

    第三个点要猜(p),只给了(pin [10^9,2cdot 10^9])。那么就一个一个猜啊。。。。当然我是不可能一个一个猜的,直接抄题解。。。。

    LOJ格式化以后的正常瞎比打空格的代码

    #include <bits/stdc++.h>
    #define il inline
    #define vd void
    #define st static
    typedef long long ll;
    il ll gi() {
        ll x;
        scanf("%lld", &x);
        return x;
    }
    std::string op;
    il ll mul(ll x, ll y, ll m) { return (x * y - m * (ll)((long double)x * y / m + 0.5) + m) % m; }
    il int wa_mul(int a, int b, int m) { return a * b % m; }
    il ll pow(ll x, ll y, ll m) {
        ll ret = 1;
        while (y) {
            if (y & 1)
                ret = mul(x, ret, m);
            x = mul(x, x, m);
            y >>= 1;
        }
        return ret;
    }
    il bool miller_rabin(ll x, int op = 0) {
        if (x < 2)
            return 0;
        if (x == 2)
            return 1;
        if (!(x & 1))
            return 0;
        ll t = 0, _x = x - 1;
        st int c[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 24251 };
        while (!(_x & 1)) _x >>= 1, ++t;
        for (int i = op; i < 10; ++i) {
            if (x == c[i])
                return 1;
            ll p = pow(c[i], _x, x);
            if (p == 1 || p == x - 1)
                continue;
            int T = t;
            while (T--) {
                p = mul(p, p, x);
                if (p == x - 1)
                    break;
            }
            if (T == -1)
                return 0;
        }
        return 1;
    }
    int main() {
        std::cin >> op;
        if (op[0] == '1' && op[1] != 'w') {
            ll m;
            if (op[1] == '_')
                m = 998244353;
            else if (op.size() == 2)
                m = 1145141;
            else
                m = 5211600617818708273ll;
            int n = gi();
            st char s[50];
            while (n--) {
                scanf("%s", s + 1);
                int l = strlen(s + 1);
                ll p = 0;
                for (int i = 1; i <= l; ++i) p = (p * 10 + s[i] - '0') % (m - 1);
                printf("%lld
    ", pow(19, p, m));
            }
        } else if (op == "1wa_998244353") {
            st std::map<int, int> mp;
            st std::vector<int> vec;
            int begin, end;
            vec.push_back(1);
            for (int i = 1, x = 19;; ++i, x = x * 19 % 998244353) {
                if (mp.find(x) == mp.end())
                    mp[x] = i, vec.push_back(x);
                else {
                    begin = mp[x], end = i;
                    break;
                }
            }
            int n = gi();
            while (n--) {
                ll x = gi();
                if (x < begin)
                    printf("%d
    ", vec[x]);
                else
                    printf("%d
    ", vec[begin + (x - begin) % (end - begin)]);
            }
        } else if (op == "2p") {
            int n = gi();
            while (n--) {
                ll l = gi(), r = gi();
                for (ll i = l; i <= r; ++i) putchar(".p"[miller_rabin(i)]);
                puts("");
            }
        } else if (op == "2u") {
            st ll mu[1000010], duliu[1000010], primes[78500], pr;
            st bool yes[1000010];
            for (int i = 2; i < 1000001; ++i) {
                if (!yes[i])
                    primes[++pr] = i;
                for (int j = 1; j <= pr && primes[j] * i < 1000001; ++j) {
                    yes[i * primes[j]] = 1;
                    if (i % primes[j] == 0)
                        break;
                }
            }
            int n = gi();
            while (n--) {
                ll l = gi(), r = gi();
                for (int j = 0; j <= r - l; ++j) mu[j] = 1, duliu[j] = 1;
                for (int j = 1; j <= pr; ++j)
                    for (ll k = l / primes[j]; k <= r / primes[j]; ++k) {
                        if (k * primes[j] - l < 0)
                            continue;
                        if (k % primes[j])
                            mu[k * primes[j] - l] *= -1, duliu[k * primes[j] - l] *= primes[j];
                        else
                            mu[k * primes[j] - l] = 0;
                    }
                for (ll j = l; j <= r; ++j) {
                    if (mu[j - l]) {
                        ll x = j / duliu[j - l];
                        if (x == 1)
                            ;
                        else if (((ll)sqrt(x)) * ((ll)sqrt(x)) == x)
                            mu[j - l] = 0;
                        else if (miller_rabin(x, 9))
                            mu[j - l] *= -1;
                    }
                    if (mu[j - l] == 0)
                        putchar('0');
                    else
                        putchar(mu[j - l] == 1 ? '+' : '-');
                }
                puts("");
            }
        } else {
            int n = gi(), m;
            while (n--) {
                int l = gi(), r = gi();
                if (l == 233333333)
                    m = 1515343657;
                else
                    m = gi();
                if (m == 998244353)
                    for (int i = l; i <= r; ++i)
                        putchar("g."[pow(i, m / 2, m) == 1 || pow(i, m / 7, m) == 1 || pow(i, m / 17, m) == 1]);
                else if (m == 13123111) {
                    st int f[13123122];
                    st bool yes[13123122];
                    for (int i = 1, g = 6; i < m; ++i, g = g * 6 % m) f[g] = i;
                    int p[] = { 2, 3, 5, 7, 11, 13, 19, 23 };
                    for (int o = 0; o < 8; ++o)
                        for (int i = p[o]; i <= m; i += p[o]) yes[i] = 1;
                    for (int i = l; i <= r; ++i) putchar("g."[yes[f[i]]]);
                } else
                    for (int i = l; i <= r; ++i)
                        putchar("g."[pow(i, m / 2, m) == 1 || pow(i, m / 3, m) == 1 || pow(i, m / 4003, m) == 1 ||
                                     pow(i, m / 15773, m) == 1]);
                puts("");
            }
        }
        return 0;
    }
    

    压行(压成一行)之后的2.7K代码

    #include<bits/stdc++.h>
    #define il inline
    #define vd void
    #define st static
    typedef long long ll;il ll gi(){ll x;scanf("%lld",&x);return x;}std::string op;il ll mul(ll x,ll y,ll m){return (x*y-m*(ll)((long double)x*y/m+0.5)+m)%m;}il int wa_mul(int a,int b,int m){return a*b%m;}il ll pow(ll x,ll y,ll m){ll ret=1;while(y){if(y&1)ret=mul(x,ret,m);x=mul(x,x,m);y>>=1;}return ret;}il bool miller_rabin(ll x,int op=0){if(x<2)return 0;if(x==2)return 1;if(!(x&1))return 0;ll t=0,_x=x-1;st int c[]={2,3,5,7,11,13,17,19,23,24251};while(!(_x&1))_x>>=1,++t;for(int i=op;i<10;++i){if(x==c[i])return 1;ll p=pow(c[i],_x,x);if(p==1||p==x-1)continue;int T=t;while(T--){p=mul(p,p,x);if(p==x-1)break;}if(T==-1)return 0;}return 1;}int main(){std::cin>>op;if(op[0]=='1'&&op[1]!='w'){ll m;if(op[1]=='_')m=998244353;else if(op.size()==2)m=1145141;else m=5211600617818708273ll;int n=gi();st char s[50];while(n--){scanf("%s",s+1);int l=strlen(s+1);ll p=0;for(int i=1;i<=l;++i)p=(p*10+s[i]-'0')%(m-1);printf("%lld
    ",pow(19,p,m));}}else if(op=="1wa_998244353"){st std::map<int,int>mp;st std::vector<int>vec;int begin,end;vec.push_back(1);for(int i=1,x=19;;++i,x=x*19%998244353){if(mp.find(x)==mp.end())mp[x]=i,vec.push_back(x);else {begin=mp[x],end=i;break;}}int n=gi();while(n--){ll x=gi();if(x<begin)printf("%d
    ",vec[x]);else printf("%d
    ",vec[begin+(x-begin)%(end-begin)]);}}else if(op=="2p"){int n=gi();while(n--){ll l=gi(),r=gi();for(ll i=l;i<=r;++i)putchar(".p"[miller_rabin(i)]);puts("");}}else if(op=="2u"){st ll mu[1000010],duliu[1000010],primes[78500],pr;st bool yes[1000010];for(int i=2;i<1000001;++i){if(!yes[i])primes[++pr]=i;for(int j=1;j<=pr&&primes[j]*i<1000001;++j){yes[i*primes[j]]=1;if(i%primes[j]==0)break;}}int n=gi();while(n--){ll l=gi(),r=gi();for(int j=0;j<=r-l;++j)mu[j]=1,duliu[j]=1;for(int j=1;j<=pr;++j)for(ll k=l/primes[j];k<=r/primes[j];++k){if(k*primes[j]-l<0)continue;if(k%primes[j])mu[k*primes[j]-l]*=-1,duliu[k*primes[j]-l]*=primes[j];else mu[k*primes[j]-l]=0;}for(ll j=l;j<=r;++j){if(mu[j-l]){ll x=j/duliu[j-l];if(x==1);else if(((ll)sqrt(x))*((ll)sqrt(x))==x)mu[j-l]=0;else if(miller_rabin(x,9))mu[j-l]*=-1;}if(mu[j-l]==0)putchar('0');else putchar(mu[j-l]==1?'+':'-');}puts("");}}else{int n=gi(),m;while(n--){int l=gi(),r=gi();if(l==233333333)m=1515343657;else m=gi();if(m==998244353)for(int i=l;i<=r;++i)putchar("g."[pow(i,m/2,m)==1||pow(i,m/7,m)==1||pow(i,m/17,m)==1]);else if(m==13123111){st int f[13123122];st bool yes[13123122];for(int i=1,g=6;i<m;++i,g=g*6%m)f[g]=i;int p[]={2,3,5,7,11,13,19,23};for(int o=0;o<8;++o)for(int i=p[o];i<=m;i+=p[o])yes[i]=1;for(int i=l;i<=r;++i)putchar("g."[yes[f[i]]]);}else for(int i=l;i<=r;++i)putchar("g."[pow(i,m/2,m)==1||pow(i,m/3,m)==1||pow(i,m/4003,m)==1||pow(i,m/15773,m)==1]);puts("");}}return 0;}
    
  • 相关阅读:
    POJ3258River Hopscotch(二分)
    POJ3273Monthly Expense(二分)
    POJ1002487-3279(map)
    HDU 3123 GCC
    POJ2031Building a Space Station
    POJ3096Surprising Strings(map)
    模板类
    POJ1265Area
    【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化
    学习笔记之MySQL
  • 原文地址:https://www.cnblogs.com/xzz_233/p/10701908.html
Copyright © 2020-2023  润新知