切了两道水题,多亏hack了5个,才加了100多
\ \ \ \ Vampire喜欢玄学,尤其喜欢研究幸运数字. \ \ \ \ 对于一个数字集合S,定义关于S的幸运数字为无法用S中的数相加得到的最小的非负整数(每个数可以使用任意次). \ \ \ \ 现在给定一个数集,如果能使用其中的数相加得到任意自然数,输出”YES”,否则输出”NO”.
\ \ \ \ 第一行一个正整数T,为数据组数. \ \ \ \ 每组数据第一行一个n,表示集合大小. \ \ \ \ 接下来n个数,表示该数集里的数. \ \ \ \ 1\le n\le 10^5,1\le T \le 10,0\le a_i \le 10^9 1≤n≤105,1≤T≤10,0≤ai≤109.
\ \ \ \ 每组数据回答一个”YES”或”NO”.
1 1 2
NO
\ \ \ \ Rivendell非常神,喜欢研究奇怪的问题. \ \ \ \ 今天他发现了一个有趣的问题.找到一条线段x+y=qx+y=q,令它和坐标轴在第一象限围成了一个三角形,然后画线连接了坐标原点和线段上坐标为整数的格点. \ \ \ \ 请你找一找有多少点在三角形的内部且不是线段上的点,并将这个个数对PP取模后告诉他.
\ \ \ \ 第一行一个数T,为测试数据组数. \ \ \ \ 接下来每一行两个数qq,PP,意义如题目中所示. \ \ \ \ q q是质数且q\le 10^{18},1\le P\le 10^{18},1\le T \le 10q≤1018,1≤P≤1018,1≤T≤10.
\ \ \ \ 对每组数据,输出点的个数模PP后的值.
1 2 107
0
所以解决方式是先找个偶数除2,然后用快速幂的形式做乘法(我叫它快速和)
#include<cstdio> #include<iostream> using namespace std; int t; long long q,p,x,y,ans; int main() { cin>>t; while(t--) { cin>>q>>p; x=q-1; y=q-2; if(x%2==0) x=x/2;else y=y/2; ans=0; while(x!=0) { if(x%2==1) ans=(ans+y)%p; x=x>>1; y=(y<<1)%p; } cout<<ans<<endl; } }