链接:戳这里
思路:
因为每个数可以用很多次,所以只要这个集合中有1,那么就可以加出所有的数来.注意最后要判定一下是否有0.
代码:
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int n; int a[1000100]; int main(){ int T; scanf("%d",&T); while(T--){ scanf("%d",&n); int flag1=0,flag2=0; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(a[i]==1){ flag1=1; } if(a[i]==0){ flag2=1; } } if(flag1 && flag2) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
思路:
考虑一条以(0,0)为起点,(x,y)为终点的线段上格点的个数(不包含端点时),一定是gcd(x,y)-1,这个很显然吧.
然后整个网格图范围内的格点数目是q*(q-1)/2
所以答案就是q*(q-1)/2 − 所有线段上的格点的个数.
因为q是质数且a+b=q可以推出gcd(a,b)=1
显然答案就是计算等腰直角三角形中的格点数
代码:
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; ll Q,P; ll kuai(ll q,ll num,ll mod){ ll ans=0; ll base=q; while(num){ if(num%2) ans=(ans+base)%mod; num/=2; base=(base+base)%mod; } return ans%mod; } int main(){ int T; scanf("%d",&T); while(T--){ cin>>Q>>P; ll ans=(Q-1)/2; ans=kuai(ans,Q-2,P); cout<<(ans+P)%P<<endl; } return 0; }
他给了你几个数:nn,aa,bb,cc,你需要告诉他fn模p后的数值.
输入描述
第一行一个数T,为测试数据组数.
每组数据一行,一行五个正整数,按顺序为nn,aa,bb,cc,pp.
1≤T≤10,1≤n≤10^18 ,1≤a,b,c≤10^9 ,p是质数且 p≤10^9 +7.
输出描述
对每组数据输出一行一个数,输出fn对p取模后的数值.
输入样例
1
5 3 3 3 233
输出样例
190
思路:
观察递推式我们可以发现,所有的 fi都是a的幂次,所以我们可以对fi取一个以a为底的log
即gi=log(a,fi)
那么递推式变成gi =b+c∗g[i−1]+g[i−2]
,这个式子可以矩阵乘法
这题有一个小trick,注意a mod p=0的情况.
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include <ctime> #include<queue> #include<set> #include<map> #include<stack> #include<iomanip> #include<cmath> #define mst(ss,b) memset((ss),(b),sizeof(ss)) #define maxn 0x3f3f3f3f #define MAX 1000100 ///#pragma comment(linker, "/STACK:102400000,102400000") typedef long long ll; typedef unsigned long long ull; #define INF (1ll<<60)-1 using namespace std; struct Matrix{ ll ma[3][3]; Matrix(){ for(int i=0;i<3;i++) for(int j=0;j<3;j++) ma[i][j]=0; } }; ll n,A,B,C,P; Matrix Mult(Matrix b,Matrix a,ll p){ Matrix ans; for(int i=0;i<3;i++){ for(int j=0;j<3;j++){ for(int k=0;k<3;k++){ ans.ma[i][j]=(ans.ma[i][j]+a.ma[i][k]*b.ma[k][j]%p)%p; } } } return ans; } Matrix MPow(Matrix a,ll num,ll p){ Matrix tmp; for(int i=0;i<3;i++) tmp.ma[i][i]=1; while(num){ if(num%2) tmp=Mult(tmp,a,p); a=Mult(a,a,p); num/=2; } return tmp; } ll Pow(ll a,ll b,ll p){ ll ans=1; while(b){ if(b%2) ans=ans*a%p; a=a*a%p; b/=2; } return ans; } int main(){ int T; scanf("%d",&T); while(T--){ cin>>n>>A>>B>>C>>P; Matrix a,b; a.ma[0][0]=1;a.ma[2][0]=B; b.ma[0][0]=1;b.ma[1][2]=1; b.ma[2][0]=B;b.ma[2][1]=1;b.ma[2][2]=C; if(n==1) cout<<1<<endl; else if(n==2) printf("%I64d\n",Pow(A,B,P)); else { if(A%P==0) cout<<0<<endl; else { Matrix tmp=MPow(b,n-2,P-1); Matrix ans=Mult(a,tmp,P-1); ll anw=Pow(A,ans.ma[2][0],P); printf("%I64d\n",anw); } } } return 0; }<strong> </strong>