活动地址:CSDN21天学习挑战赛
通过样例就可以看出来了,x=n,y=n+1,z=n*(n+1)完全符合任何一种情况,当n=1时无解,感觉这题1500有点高了
- #include
- using namespace std;
- #define ll long long
- #define lowbit(i) ((i)&(-i))
- const ll mod=10000;
- double eps=1e-8;
- ll n;
- int main(){
- cin>>n;
- if(n==1){
- printf("-1\n");
- }
- else{
- printf("%lld %lld %lld\n",n,n+1,n*(n+1));
- }
- system("pause");
- return 0;
- }
这题好多坑点,其实也是自己做这个题太莽了没注意到隐含的条件,想一下如果条件符合不是-1的情况下我们只需要输出d[1]*d[n]就可以了,可以试一试随便一个数都是等于第一个因子乘以最后一个的,前提是排好序的情况下;重点其实是判断-1的情况,wa了很多发,需要判断每个d[i]和d[n-i+1]的乘积是不是一样的,另外还需要判断每个d[i]的因子是否出现过,如果d[i]出现了因子却没出现这显然是不符合情况的
- #include
- using namespace std;
- #define ll long long
- #define lowbit(i) ((i)&(-i))
- const ll mod=10000;
- double eps=1e-8;
- ll t,n,d[305],vis[1000006];
- ll lcm(ll a,ll b){
- return a*b/__gcd(a,b);
- }
- bool su(ll x){
- for(int i=2;i<=sqrt(x);i++)
- if(x%i==0) return false;
- return true;
- }
- int main(){
- scanf("%lld",&t);
- while(t--){
- scanf("%lld",&n);
- for(int i=1;i<=n;i++) scanf("%lld",&d[i]),vis[d[i]]=1;
- sort(d+1,d+n+1);
- ll flag=1,tm=d[1]*d[n];
- for(int i=1;i<=n;i++){
- for(int j=2;j<=sqrt(d[i]);j++){
- if(d[i]%j==0&&(vis[d[i]/j]==0||vis[j]==0)){flag=0;break;}
- }
- }
- for(int i=2;i<=(n+1)/2;i++){
- if(d[i]*d[n-i+1]!=tm){flag=0;break;}
- }
- if(flag) printf("%lld\n",d[1]*d[n]);
- else printf("-1\n");
- for(int i=1;i<=n;i++) vis[d[i]]=0;
- }
- system("pause");
- return 0;
- }
好家伙连一个式子都推不出来,,,
题意也弄错了,,应该是要求任意素数区间段内红色大于蓝色,问有多少种方案。
我们先看2的时候,满足的有rr,br,rb,等于3的时候就要从2的时候转移过来只看后两位,rr可以变为rb,rr;br可以变为rr,rb不可以因为这样r就小于b了;rb可以变为br。可以看出rr可以有上一次的rr和br转移过来,br可以有上一次的rb转移过来,rb可以有上一次的rr转移过来,设a[i],b[i],c[i]为n=i时rr,br,rb的个数,则有a[i]=a[i-1]+b[i-1],b[i]=c[i-1],c[i]=a[i-1],而题目要求的是s[i]=a[i]+b[i]+c[i],所以
s[i]=a[i]+b[i]+c[i]=2a[i-1]+b[i-1]+c[i-1]
s[i-1]=2a[i-2]+b[i-2]+c[i-2]
s[i-2]=2a[i-3]+b[i-3]+c[i-3]
s[i-3]=2a[i-3]+b[i-3]+c[i-3]
s[i]=2a[i-1]+b[i-1]+c[i-1]=3a[i-2]+2b[i-2]+c[i-2]
=s[i-1]+a[i-2]+b[i-2]
=s[i-1]+a[i-3]+b[i-3]+c[i-3]
=s[i-1]+s[i-3];
递推式就推出来了,转移矩阵也就好写了,注意要从4开始因为n>=2所以最小的s[n-1]是s[4],另外最后乘起来的时候B矩阵的第一行所有的数都要参与乘法,即
res.mat[0][0]*6LL%mod+res.mat[0][1]*4LL%mod+res.mat[0][2]*3LL%mod
HDU - 6030 - Happy Necklace - (矩阵快速幂 )_菜圾的博客-CSDN博客
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- //HDU火车头
- //#include
- #define ll long long
- #define lowbit(x) ((x)&(-x))
- using namespace std;
- const ll mod=1e9+7;
- double eps=1e-8;
-
- struct matrix{
- ll row,col;
- ll mat[4][4];
- matrix(){
- memset(mat,0,sizeof(mat));
- }
- void init(){
- *this=matrix();
- row=col=3;
- for(int i=0;i<3;i++) mat[i][i]=1;
- }
- matrix operator*(const matrix& a)const{
- matrix res=matrix();res.row=row;res.col=col;
- for(int i=0;i
|
- for(int j=0;j
- for(int k=0;k
- res.mat[i][j]=(res.mat[i][j]+mat[i][k]*a.mat[k][j])%mod;
- return res;
- }
- matrix matpow(ll b){
- matrix res = matrix();
- res.init();
- matrix base=*this;
- while(b){
- if(b&1) res=res*base;
- base=base*base;
- b>>=1;
- }
- return res;
- }
- };
- int main(){
- ll t,n;
- scanf("%lld",&t);
- while(t--){
- scanf("%lld",&n);
- if(n==2) printf("3\n");
- else if(n==3) printf("4\n");
- else if(n==4) printf("6\n");
- else{
- matrix b=matrix();
- b.row=b.col=3;
- b.mat[0][0]=b.mat[0][2]=b.mat[1][0]=b.mat[2][1]=1;
- matrix res=b.matpow(n-4LL);
- //cout<
- printf("%lld\n",(res.mat[0][0]*6LL%mod+res.mat[0][1]*4LL%mod+res.mat[0][2]*3LL%mod)%mod);
- }
- }
- system("pause");
- return 0;
- }
-
Mathematician QSC - HDU 5895 - 矩阵快速幂+欧拉函数降幂
这个题只要会矩阵快速幂的板子再加上欧拉函数的板子再加上欧拉降幂的公式就可以把这个题给过掉了,写代码花了很长时间,另外其实矩阵也不是很好推,但是由于昨天看的课中有个类型一样的式子就很快推出来了
HDU 5895 矩阵快速幂+欧拉降幂公式+指数循环节_legend_PawN的博客-CSDN博客
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- //HDU火车头
- //#include
- #define ll long long
- #define lowbit(x) ((x)&(-x))
- using namespace std;
- ll mod=1e9+7;
- double eps=1e-8;
- struct matrix{
- ll row,col;
- ll mat[4][4];
- matrix(){
- memset(mat,0,sizeof(mat));
- }
- void init(){
- *this=matrix();
- row=col=4;
- for(int i=0;i<4;i++) mat[i][i]=1;
- }
- matrix operator*(const matrix& a)const{
- matrix res=matrix();res.row=row;res.col=col;
- for(int i=0;i
|
- for(int j=0;j
- for(int k=0;k
- res.mat[i][j]=(res.mat[i][j]+mat[i][k]*a.mat[k][j])%mod;
- return res;
- }
- matrix matpow(ll b){
- matrix res = matrix();
- res.init();
- matrix base=*this;
- while(b){
- if(b&1) res=res*base;
- base=base*base;
- b>>=1;
- }
- return res;
- }
- };
- ll eulerfunc(ll x){
- ll res=x;
- for(ll i=2;i*i<=x;i++){
- if(x%i==0){
- res=res/i*(i-1);
-
- while(x%i==0) x/=i;
- }
- }
- if(x>1) res=res/x*(x-1);
- return res;
- }
- ll qpow(ll a,ll b,ll s){
- ll res=1;
- while(b){
- if(b&1) res=res*a%s;
- a=a*a%s;
- b>>=1;
- }
- return res;
- }
- int main(){
- ll t,n,y,x,s;
- scanf("%lld",&t);
- while(t--){
- matrix b=matrix();
- b.row=b.col=4;
- b.mat[0][0]=b.mat[0][3]=b.mat[1][3]=b.mat[2][2]=b.mat[3][1]=1;
- b.mat[0][1]=b.mat[0][2]=b.mat[1][1]=b.mat[1][2]=4;
- b.mat[2][1]=2;
- scanf("%lld%lld%lld%lld",&n,&y,&x,&s);
- if(n*y==0){
- printf("1\n");continue;
- }
- mod=eulerfunc(s+1);
- matrix res=b.matpow(n*y-1);
- ll g=(res.mat[0][0]+res.mat[0][1])%mod+mod;
- //cout<
- ll ans=qpow(x,g,s+1);
- printf("%lld\n",ans);
- }
- system("pause");
- return 0;
- }
-
Matrix Power Series - POJ 3233 - 矩阵快速幂
虽然题目变成矩阵了,但还是注意一下矩阵的特性,照样推就可以,忘了初始化c矩阵的行数和列数了,导致检错花费了半小时
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- //HDU火车头
- //#include
- #define ll long long
- #define lowbit(x) ((x)&(-x))
- using namespace std;
- ll mod=1e9+7;
- double eps=1e-8;
- int n,t,m,k;
- struct matrix{
- int row,col;
- int mat[62][62];
- matrix(){
- memset(mat,0,sizeof(mat));
- }
- void init(){
- *this=matrix();
- row=col=t;
- for(int i=0;i
1; - }
- matrix operator*(const matrix& a)const{
- matrix res=matrix();res.row=row;res.col=col;
- for(int i=0;i
|
- for(int j=0;j
- for(int k=0;k
- res.mat[i][j]=(res.mat[i][j]+mat[i][k]*a.mat[k][j])%mod;
- return res;
- }
- matrix matpow(int b){
- matrix res = matrix();
- res.init();
- matrix base=*this;
- while(b){
- if(b&1) res=res*base;
- base=base*base;
- b>>=1;
- }
- return res;
- }
- };
-
- int main(){
- scanf("%d%d%d",&n,&k,&m);
- mod=m;
- t=2*n;
- matrix b=matrix(),c=matrix();
- b.row=b.col=c.row=c.col=t;
- for(int i=0;i
- b.mat[i][i]=1;
- for(int j=0;j
- scanf("%d",&c.mat[i][j]);
- c.mat[i][j]%=mod;
- c.mat[i+n][j]=c.mat[i][j];
- b.mat[i][j+n]=c.mat[i][j];
- b.mat[i+n][j+n]=c.mat[i][j];
- }
- }
-
- matrix res=b.matpow(k-1);
- //cout<
- //cout<
- res=res*c;
- for(int i=0;i
- for(int j=0;j
- printf("%lld ",res.mat[i][j]);
- printf("\n");
- }
- system("pause");
- return 0;
- }
-
Kiki & Little Kiki 2 - HDU 2276 - 矩阵快速幂
f[n][l]表示在第n秒,第l个字符的状态,则f[n][l]有两种情况
- f[n][l]=f[n-1][l] //f[n-1][l-1]==0
- f[n][l]=1-f[n-1][l] //f[n-1][l-1]==1
进而发现可以转化成一种情况:f[n][l]=(f[n-1]l]+f[n-1][l-1])%2
然后就可以造出转移矩阵
![\begin{bmatrix} f[n][1]\\ f[n][2]\\ ...\\ f[n][l] \end{bmatrix}=\begin{bmatrix} 1 & 0 &... & 0 & 1\\ 1& 1 &... & 0 & 0\\ & & ... & & \\ 0& 0 &... & 1 & 1 \end{bmatrix}*\begin{bmatrix} f[n-1][1]\\ f[n-1][2]\\ ...\\ f[n-1][l] \end{bmatrix}](https://latex.codecogs.com/gif.latex?%5Cbegin%7Bbmatrix%7D%20f%5Bn%5D%5B1%5D%5C%5C%20f%5Bn%5D%5B2%5D%5C%5C%20...%5C%5C%20f%5Bn%5D%5Bl%5D%20%5Cend%7Bbmatrix%7D%3D%5Cbegin%7Bbmatrix%7D%201%20%26%200%20%26...%20%26%200%20%26%201%5C%5C%201%26%201%20%26...%20%26%200%20%26%200%5C%5C%20%26%20%26%20...%20%26%20%26%20%5C%5C%200%26%200%20%26...%20%26%201%20%26%201%20%5Cend%7Bbmatrix%7D*%5Cbegin%7Bbmatrix%7D%20f%5Bn-1%5D%5B1%5D%5C%5C%20f%5Bn-1%5D%5B2%5D%5C%5C%20...%5C%5C%20f%5Bn-1%5D%5Bl%5D%20%5Cend%7Bbmatrix%7D)
题目挺好的,玛德自己写的不知道为啥就是一直T,换了种题解的写法感觉并没有啥不同并且他还有memset,只是把求快速幂的函数从结构体中拿出来了,然后就能过,我他妈我的就不过,我的构造矩阵还不是n方,是n,玛德不让我过,这他妈的卡的那么严实吗,我浪费了得快一个小时,为了这个TLE,丫的毫无意义
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- //HDU火车头
- //#include
- #define ll long long
- #define lowbit(x) ((x)&(-x))
- using namespace std;
- int mod=1e9+7;
- double eps=1e-8;
- int t,m;
- char s[110];
- struct matrix
- {
- int mat[150][150];
- matrix() {}
- matrix operator*(matrix const &b)const
- {
- matrix res;
- memset(res.mat, 0, sizeof(res.mat));
- for (int i = 0 ;i <=t; i++)
- for (int j = 0; j <= t; j++)
- for (int k = 0; k <=t; k++)
- res.mat[i][j] = (res.mat[i][j]+this->mat[i][k] * b.mat[k][j])%mod;
- return res;
- }
- };
- matrix pow_mod(matrix base, int n)
- {
- matrix res;
- memset(res.mat, 0, sizeof(res.mat));
- for (int i = 0; i
- res.mat[i][i] = 1;
- while (n > 0)
- {
- if (n & 1) res = res*base;
- base = base*base;
- n >>= 1;
- }
- return res;
- }
- int main(){
- while(~scanf("%d",&m)){
-
- scanf("%s",&s);
- t=strlen(s);mod=2;
- // matrix base;
- // int x=t-1;
- // for(int i=0;i
- // b.mat[i][x]=1;
- // x=(x+1)%t;
- // b.mat[i][x]=1;
- // c.mat[i][0]=s[i]-'0';
- // }
- matrix base;
- for(int i=0;i
- for(int j=0;j
- base.mat[i][j]=0;
- base.mat[0][0]=1;
- base.mat[0][t-1]=1;
- for(int i=1;i
- for(int j=1;j
- {
- if(i==j)
- {
- base.mat[i][j]=1;
- base.mat[i][j-1]=1;
- }
- }
-
- matrix res=pow_mod(base,m);
- for(int i=0;i
- int sum=0;
- for(int j=0;j
- {
- sum=(sum+res.mat[i][j]*(s[j]-'0'))%mod;
- }
- printf("%d",sum);
- }
- printf("\n");
- }
- system("pause");
- return 0;
- }
-
-
相关阅读:
29.Xaml TreeView控件---->树形控件,节点的形式显示数据
基于Spring Boot应用Java原生JDBC操作数据库(查增改删)
Netty高性能之Reactor模型
弹框确认按钮,请求两个接口跳转刷新页面,并使用async和await将异步改成同步的数据?
大数据技术学习笔记(二)—— Hadoop 运行环境的搭建
CAA的VS Studio安装
使用gradio创建一个提取pdf、excel中表格数据的demo
nginx(五十七)ngx_http_upstream模块(二)一致性hash算法
Spark+Hadoop环境搭建
华为机试真题 C++ 实现【连接器问题】【2022.11 Q4新题】
-
原文地址:https://blog.csdn.net/weixin_52621204/article/details/126283333