2019山东省赛K - Happy Equation ZOJ - 4123 题解

题意:

  一个数论题,要求满足如下等式的x有多少个。

思路:

  当时比赛是,队伍看到这个题,也没有做太多的思考,就是无从下手,几乎放弃。但是看到学校另外两支队伍都过了这个题,感觉自己还是好菜。

  打表可以发现,当a为奇数的时候答案为1。当a为偶数的时候,x一定也是偶数,这个还是比较明显的。

  对左边进行推导,因为a为偶数,设a=2*t,所以a^x=2^x*t^x,所以当x大于p时,这个求余之后一定为0。由于p很小,可以直接暴力求解,所以对于右边直接考虑x^a求余之后为0的x的情况。由于x为偶数。我们再次对x分解,设x=2^k*t,就是把x写成一个2的 次幂和t的乘积的形式,所以x^a=2^(ka)*t^a,所以只需要ka>=p,就可以满足条件,而且只有ka>=p可以满足条件,因为t^a不可能可以整除,所以现在要求k>=p/a,对p/a取上整即可,就是考察有多少个t,在1-up的范围内(up为x的上界),个数为up/ceil(p/a)/2^k。当然最后的答案要减去1-p范围内的数,因为这一部分是特殊考虑的。

  

 1 #include <iostream>
 2 #include<cmath>
 3 #include<stdio.h>
 4 //a^x 与x^a
 5 // 1<=x<=2^p
 6 using namespace std;
 7 #define ll long long
 8 ll ppow(int x,int n,ll mod)
 9 {
10     ll res=1;
11     ll base=x;
12     while(n)
13     {
14         if(n&1)
15             res=(res*base)%mod;
16         base=(base*base)%mod;
17         n>>=1;
18     }
19     return res%mod;
20 }
21 int main()
22 {
23     int a,p;
24     int T;
25     while(~scanf("%d",&T))
26     {
27         while(T--)
28         {
29             scanf("%d%d",&a,&p);
30
31             if(a%2)
32             {
33                 cout<<1<<endl;
34                 continue;
35             }
36             //x>=p
37             ll  up=(1LL<<p);
38             ll ans=0;
39             for(int i=1;i<=p;i++){
40                 if(ppow(a,i,up)==ppow(i,a,up))ans++;
41             }
42             ll tem=ceil(p/(a+0.0));
43             ans+=(up>>tem)-(p>>tem);
44             cout<<ans<<endl;
45         }
46     }
47
48     return 0;
49 }

原文地址:https://www.cnblogs.com/gzr2018/p/10883184.html

时间: 2024-10-04 00:22:57

2019山东省赛K - Happy Equation ZOJ - 4123 题解的相关文章

2019山东省赛B - Flipping Game ZOJ - 4114 题解

题意: 初始有n个灯泡,灯泡状态是0和1,.现在有k轮操作,每次改变且仅改变m个的灯的状态,给定n盏灯的初始状态的最终状态,求有多少种解决改变灯的方案满足可以满足题目条件. 思路: 开始写的时候以为是组合计数和容斥原理什么鬼的,后来发现n,m,k的值都比较小,觉得应该是三维dp了,当然是瞎想,最后看题解还是一个二维dp可以解决的问题,只不过是三重循环.给队友lrr说了一下题解的状态定义,他也较快就写出来了.其实对于灯的状态,每次改变一次之后,现在的问题和之前的问题形式一样,只是k值和目标灯的状态

K - Happy Equation(ZOJ 4123)

Time Limit : 1 Second      Memory Limit : 65536 KB Source : 第十届山东省ACM省赛 Problem Link : ZOJ 4123 Author : Houge Date : 2019-5-24 看了快一周的k题,看了好多题解,还是不明白,只恨自己不是数论大佬.昨天看了本校数竞大佬Ch_3225的题解,感觉还不错,和我目前看过的都不太一样(但还是看不懂).征得同意后,这里就直接copy上来了. (注意:在此篇题解中,为码字方便,记a^b

Happy Equation ZOJ - 4123 (数论)

题目链接:ZOJ - 4123  题目大意:给你a和p,然后问你[1,2^p]中满足那个等式的值有多少个. 具体思路: 具体的证明:https://blog.csdn.net/v5zsq/article/details/79325038 打表发现当a为奇数的时候答案为1.当a为偶数的时候,x也必须为偶数. 然后我们将a分解为2*t.然后a^x就等于 (2^x)*(t^x).当x大于p的时候,此时取模后一定为0.对于所以在x属于[0,p]这段区间暴力算. 然后我们将b分解为(2^k)*t.然后b^

2019山东省赛反省

此次比赛,我很荣幸得此机会跟着学长学姐去打铁.第一次接触这种比赛,确实感到新奇,同时也有不安,因为平时没好好做题,知之甚少,基础确实是超级不稳的.好在学长说让我们开阔一下眼界,尽力就行.比赛做出几个题我就不说了,但是补题的时候真的发现我们真的很菜,简单的题我们竟然可以耗时那么久.....emmm,,以后可得努力了 A - Calandar On a planet far away from Earth, one year is composed of 12 months, and each mo

2019湖南省赛 K 双向链表练习题(list)

https://ac.nowcoder.com/acm/contest/1099/K 这题大概只要会list就会做吧...我是真的dd 1 #define bug(x) cout<<#x<<" is "<<x<<endl 2 #define IO std::ios::sync_with_stdio(0) 3 #include <bits/stdc++.h> 4 #define iter ::iterator 5 #define

2019浙江省赛K zoj4110 Strings in the Pocket(manachar)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=6012 题意 给你两个串,可以翻转a串的一个区间,问有多少对l,r使得翻转后的a串等于b串 题解 沙比提,比赛时想了想两个串相等就用马拉车求回文子串个数,觉得两个串不相等情况很复杂就没想下去了,其实两个串不相等的情况更好处理 两个串不一样的话,一定需要翻转第一个和最后一个不相等的位置(关键),判一下中间是不是回文串,然后维护一下两边即可 特判只有一个字符不相等的时候 代码 #i

山东省赛题 NEU OJ 1444 线段树双标记

http://acm.neu.edu.cn/hustoj/problem.php?id=1444 OJ问题论坛发帖http://t.cn/zjBp4jd FAQ http://t.cn/zjHKbmN Linux问题看http://t.cn/aWnP1n 1444: Devour Magic 时间限制: 1 Sec  内存限制: 256 MB 提交: 129  解决: 21 [提交][状态][讨论版] 题目描述 In Warcraft III, Destroyer is a large flyi

第五届山东省赛总结

这次比赛在HITWH,10号我们早早的坐车来到了威海,然后随便逛了逛,吃了饭,就是热身赛. 热身赛题目比较坑爹,尤其是A题,要求区间素数个数,给的数据是10^7,我写了一个却WA了.后来得知有10^9的情况,感觉一下成了神题,我想了好久也没思路,结束后得知大于10^7的数全部当成10^7做,太坑.但这样都有人能AC,真是膜拜.B题是要交一个随机数,RP比较好,2A.C据说是概率DP,我不会也没仔细看. 之后是开幕式,完了以后我一个人回了宾馆,跟山大威海的同学吃了一顿,随后回去看了看电视就睡了.

hdu1212 Big Number &amp;第六届山东省赛Single Round Math (同余定理,大数取模)

题目链接:Big Number 题目大意:每次输入两个数,第一个是高精度,第二个数小于100000:求 a mod b 根据同余定理: (a+b)% c = (a%c+ b%c)%c (a*b)%c =  ( a%c* b%c)%c 所以 对于大数,例如 :123 可以这样分解 123 =  (1*10+2)*10 + 3: 123 % c =   (  (  (  1%c *  10%c)%c + 2%c) %c  * 10%c) + 3 %c  ) %c; 因此,我们用字符串处理这个数,通过