3283: 运算器

3283: 运算器

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 340  Solved: 105
[Submit][Status][Discuss]

Description

操作有3种:

Input

第一行一个正整数N,描述数据组数。

接下来的N行,每行4个正整数Sum,y,z,p。

Sum表述询问类型,如上题所述。对于第2种要求,若X不存在,则输出“Math Error”

Output

要求有N行输出,每行一个整数,为询问的答案。

Sample Input

4
1 2 10 1000
2 3 1 1000
2 2 3 4
3 2 7 9

Sample Output

24
0
Math Error
3

HINT

操作1个数小于501。保证Y,Z,P小于10^9

操作2个数小于51 保证Y,Z,P小于10^9 P不一定为质数

操作3个数小于51 保证Y,Z小于10^9,P小于10^9

P不一定为质数

P<=10^9

假设分解质因数后,P=p1^s1*p2^s2*……保证pi^ki<=10^5

Source

giant step baby step

操作1:快速幂

操作2:扩展BSGS

操作3:扩展lucas

#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
struct Thash{
    static const ll N=1e6+5,MOD=233333;
    ll tot,val[N],h[N],next[N],head[MOD+100];
    void clear(){tot=0;memset(head,0,sizeof head);}
    void insert(ll H,ll VAL){
        for(ll i=head[H%MOD];i;i=next[i]) if(h[i]==H){val[i]=VAL;return ;}
        h[++tot]=H;val[tot]=VAL;next[tot]=head[H%MOD];head[H%MOD]=tot;
    }
    ll get(ll H){
        for(ll i=head[H%MOD];i;i=next[i]) if(h[i]==H) return val[i];
        return -1;
    }
}M;
inline ll read(){
    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;
}
ll fpow(ll a,ll p,ll mod){
    ll res=1;
    for(;p;p>>=1,a=a*a%mod) if(p&1) res=res*a%mod;
    return res;
}
ll gcd(ll a,ll b){
    if(!b) return a;
    return gcd(b,a%b);
}
void exgcd(ll a,ll b,ll &d,ll &x,ll &y){
    if(!b){d=a;x=1;y=0;return ;}
    exgcd(b,a%b,d,y,x);
    y-=a/b*x;
}
ll inv(ll a,ll p){
    ll d,x,y;
    exgcd(a,p,d,x,y);
    return d==1?(x%p+p)%p:-1;
}
ll BSGS(ll a,ll b,ll mod){
    M.clear();
    ll m=(ll)ceil(sqrt(mod+0.5));
    ll t=1;
    for(ll i=0;i<m;i++){
        M.insert(t,i);
        t=t*a%mod;
    }
    ll base=inv(t,mod);
    ll res=b;
    for(ll i=0,z;i<m;i++){
        if((z=M.get(res))!=-1) return i*m+z;
        res=res*base%mod;
    }
    return -1;
}
ll solve(ll a,ll b,ll mod){
    ll A=1,D=1,cnt=0,ans;
    for(int i=0;i<=50;i++){
        if(A==b) return i;
        A=A*a%mod;
    }
    for(ll t;(t=gcd(a,mod))!=1;){
        if(b%t)return -1;
        b/=t;
        mod/=t;
        D*=a/t;D%=mod;
        cnt++;
    }
    b=b*inv(D,mod)%mod;
    ans=BSGS(a,b,mod);
    if(~ans) return ans+cnt;
    return -1;
}
ll mul(ll n,ll pi,ll pk){
    if(!n) return 1;
    ll ans=1;
    if(n/pk){
        for(ll i=2;i<=pk;i++) if(i%pi) ans=ans*i%pk;
        ans=fpow(ans,n/pk,pk);
    }
    for(ll i=2;i<=n%pk;i++) if(i%pi) ans=ans*i%pk;
    return ans*mul(n/pi,pi,pk)%pk;
}
ll C(ll n,ll m,ll pi,ll pk,ll mod){
    if(n<m) return 0;
    ll a=mul(n,pi,pk),b=mul(m,pi,pk),c=mul(n-m,pi,pk);
    ll ans,k(0);
    for(ll i=n;i;i/=pi) k+=i/pi;
    for(ll i=m;i;i/=pi) k-=i/pi;
    for(ll i=n-m;i;i/=pi) k-=i/pi;
    ans=a*inv(b,pk)%pk*inv(c,pk)%pk*fpow(pi,k,pk)%pk;
    return ans*(mod/pk)%mod*inv(mod/pk,pk)%mod;
}
void case2(ll a,ll b,ll c){
    ll ans=solve(a,b%c,c);
    if(~ans) printf("%lld\n",ans);
    else puts("Math Error");
}
void case3(ll n,ll m,ll MOD){
    ll x=MOD,ans=0;
    for(ll pk,i=2;i*i<=MOD;i++){
        if(!(x%i)){
            pk=1;
            while(!(x%i)) pk*=i,x/=i;
            ans=(ans+C(n,m,i,pk,MOD))%MOD;
        }
    }
    if(x>1) ans=(ans+C(n,m,x,x,MOD))%MOD;
    printf("%lld\n",ans);
}
int main(){
    int T=read();
    for(ll opt,y,z,p;T--;){
        opt=read();y=read();z=read();p=read();
        if(opt==1) printf("%lld\n",fpow(y,z,p));
        if(opt==2) case2(y,z,p);
        if(opt==3) case3(z,y,p);
    }
    return 0;
}
时间: 2024-10-28 06:43:07

3283: 运算器的相关文章

结对编程1_四则运算器_博客1

一.我和小伙伴的合照 结对人员:13061163  赵庶宏 13061196  付帅 是不是感觉我俩很有爱?其实,这都是被逼的,dealline是第一生产力!!!! 二.结对编程的优点 三.覆盖率 覆盖率 95.72% ,其实也并不高..... 四.UML 五.关键算法 结对编程1_四则运算器_博客1

基于MVP模式实现四则运算器

基于MVP模式四则运算器 来到新东家,项目的框架采用的是MVP模式,刚来公司的时候,项目经理给予分配小任务,首先熟悉MVP模式,而后普通的四则运算器的实现使用MVP分层.这里主要回顾当时做任务时候的对于MVP模式的理解. 我是一名.Net开发工程师,使用语言为C#.微软在桌面客户端的开发上,提供的是WinForm和WPF两种基于.Net Framework的平台,现在的项目也是主要以Winform实现.传统Winform程序如果不予以分层的话,代码耦合十分严重.为解决代码耦合性问题,现在主流的分

随机加减乘除运算器

/** 随机加减乘除运算器,要求如下:程序依次出 10 道题目,由用户输入题目的答案.用户 每答完一道题,由系统提示结果:答错了或者答对了.10 道题目答完之后,系统计算得分 并输出.如果用户希望提前结束,则可以输入-1提前退出. /** 随机加减乘除运算器,要求如下:程序依次出 10 道题目,由用户输入题目的答案.用户 每答完一道题,由系统提示结果:答错了或者答对了.10 道题目答完之后,系统计算得分 并输出.如果用户希望提前结束,则可以输入-1提前退出. ------------------

高级四则运算器—结对项目反思(193 &amp; 105)

高级四则运算器—结对项目反思(193 & 105) 本周我和一位韩国同学(71061105)一起结对编程完成了我们的结对项目——高级的小学四则运算题目生成器. PSP表格   PSP2.1 Personal Software Process Stages Time Planning 计划 · Estimate · 估计这个任务需要多少时间 1.5h Development 开发 · Analysis · 需求分析 (包括学习新技术) 3h · Design Spec · 生成设计文档 5h ·

bzoj3283: 运算器

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 using namespace std; 7 typedef long long int64; 8 int Case; 9 #define maxn 200005 10 #define maxm 600005 11 int now[ma

四则运算器改进

在四则运算器基本功能上添加了判断正误的功能. 引用自网上的简单四则运算器代码,加以修改. 代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 #include <math.h> 5  6 int main() 7 { 8     int i = 0; 9     int n = 0;10     int x = 0;11     int type;12     char

高级四则运算器—结对项目总结(193 &amp;105)

高级四则运算器—结对项目总结 为了将感想与项目经验体会分割一下,特在此新开一篇博文. 界面设计 啥都不说,先上图震慑一下... 上面的三个界面是我们本次结对项目的主界面,恩,我也觉得挺漂亮的!你问我界面设计花了多久?其实只有6个小时,然后6个小时中有2个小时都是为了一个bug,这个bug之后我们会提到,也是让我长了一回见识. 关于整个界面的美化 关于整个界面的美化,因为之前做Java的Swing开发,知道有这种控件的皮肤(Swing里是叫LAF=LookAndFeel),所以在一开始我就敲定了要

bzoj 3283 扩展BSGS + 快速阶乘

T2  扩展BSGS T3 快速阶乘 给定整数n,质数p和正整数c,求整数s和b,满足n! / pb = s mod pc 考虑每次取出floor(n/p)个p因子,然后将问题转化为子问题. 1 /************************************************************** 2 Problem: 3283 3 User: idy002 4 Language: C++ 5 Result: Accepted 6 Time:1704 ms 7 Memor

【POJ】3283 Card Hands

字典树. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <stack> 6 using namespace std; 7 8 #define TRIEN 56 9 10 typedef struct Trie { 11 Trie *next[TRIEN]; 12 Trie() { 13 for (int i