zoukankan      html  css  js  c++  java
  • 整数矩阵CMO 2102回馈(gauss整数解)

    PS:今天上午,非常郁闷,有很多简单基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!

        整数和矩阵

        整数和矩阵

        本题是CMO(数学 Olympics) 2012 第二题

        所以还是很坑的……(出题人是shuxuedi)

        反正这题总算是写了一个远远长于正解的打表(Gauss消元-判断有无整数解/无解,已肯定谜底是不是可行)

        

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<functional>
    #include<iostream>
    #include<cmath>
    #include<cctype>
    #include<ctime>
    using namespace std;
    #define For(i,n) for(int i=1;i<=n;i++)
    #define Fork(i,k,n) for(int i=k;i<=n;i++)
    #define Rep(i,n) for(int i=0;i<n;i++)
    #define ForD(i,n) for(int i=n;i;i--)
    #define RepD(i,n) for(int i=n;i>=0;i--)
    #define Forp(x) for(int p=pre[x];p;p=next[p])
    #define Lson (x<<1)
    #define Rson ((x<<1)+1)
    #define MEM(a) memset(a,0,sizeof(a));
    #define MEMI(a) memset(a,127,sizeof(a));
    #define MEMi(a) memset(a,128,sizeof(a));
    #define INF (2139062143)
    #define F (100000007)
    #define MAXN (10)
    long long mul(long long a,long long b){return (a*b)%F;}
    long long add(long long a,long long b){return (a+b)%F;}
    long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
    long long gcd(long long a,long long b){if (!b) return a;return gcd(b,a%b);}
    long long lcm(long long a,long long b){return a/gcd(a,b)*b;}
    int n,a[10][10],b[100]={0};
    int f[100+10][100+10]={0},un_fre[2*MAXN]={0};
    int f2[100+10][100+10]={0};
    void print()
    {
    	For(i,2*n)
    	{
    		For(j,2*n+1) cout<<f2[i][j]<<' ';
    		cout<<endl;
    	}
    	cout<<endl;
    }
    int gauss(int N)
    {
    	memcpy(f2,f,sizeof(f));
    	//print();
    	memset(un_fre,0,sizeof(un_fre));
    	int k=1;
    	For(i,2*n)
    	{
    		int t=0;
    		Fork(j,k,N) if (f2[j][i]) t=j;
    		if (!t) continue;//cout<<t<<' '<<i<<' '<<f[t][i]<<' '<<k<<endl;
    		//print();
    		swap(f2[k],f2[t]);
    		//print();
    		Fork(j,1,N)
    		{
    			if (j^k&&f2[j][i]) 
    			{
    				int _l=lcm(abs(f2[j][i]),abs(f2[k][i]));
    				int ta=_l/f2[k][i],tb=_l/f2[j][i];
    				Fork(l,1,2*n+1) f2[j][l]=f2[k][l]*ta-f2[j][l]*tb;
    			}
    		}
    		un_fre[k]=i;		 
    		k++;
    	}k--;
    	/*
    	For(i,k)
    	{
    		if (f[i][2*n+1]%f[i][un_fre[i]]) return 2;
    		else f[i][2*n+1]/=f[i][un_fre[i]];
    		//if (f[i][2*n+1]<0) return -1;
    	}*/
    	//cout<<k<<endl;
    	
    	Fork(i,k+1,N)
    	{
    		if (f2[i][2*n+1]) return 0;
    	}
    	//print();
    	/*
    	For(i,k)
    	{
    		cout<<un_fre[i]<<':'<<f2[i][2*n+1]<<' ';
    	}cout<<endl;*/
    	//print();
    	//system("pause");
    	return 1;
    		
    }
    int tot=0;
    void dfs(int i,int j)
    {
    	if (j>n) i++,j=1;
    	if (i==n+1)
    	{
    		tot++;
    		For(i,n)
    		{
    			For(j,n) cout<<a[i][j]<<' ';
    			cout<<endl;
    		}
    		cout<<endl;
    	}	
    	For(p,n*n) if (!b[p])
    	{
    		b[p]=1;
    		a[i][j]=p;
    		//memset(f[(i-1)*n+j],0,sizeof(f[(i-1)*n+j]));
    		f[(i-1)*n+j][i]=f[(i-1)*n+j][n+j]=1;f[(i-1)*n+j][2*n+1]=p;
    		if ((i-1)*n+j==n*n) if (gauss((i-1)*n+j)^1) {b[p]=0;continue;}
    		dfs(i,j+1);
    		b[p]=0;
    	}
    }
    int main()
    {
    //	freopen("repay.in","r",stdin);
    //	freopen(".out","w",stdout);
    	cin>>n;
    	dfs(1,1);
    	cout<<tot<<endl;
    	return 0;
    }
        每日一道理
    俄国作家契诃夫说:“有大狗,有小狗,小狗不该因为大狗的存在而心慌意乱。所有的狗都应该叫,就让他各自用上帝给他的声音。

        好吧……到4已经打不出表了……

        观察后发明:

        每一个矩阵满意如下性质

        每行or 每列 数字集合一定是kp+1,kp+2...kp+p 型

        1 2 3           4 7 1

        4 5 6   or    5 8 2

        7 8 9           6 3 9

        行和列可以互换(必须整行整列)

        于是谜底就是2(行/列)*(p!)第一行排列顺序(p!)行的排列顺序

        这题尽管n很大,但是过了10007以后就都是0了

        

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<functional>
    #include<iostream>
    #include<cmath>
    #include<cctype>
    #include<ctime>
    using namespace std;
    #define For(i,n) for(int i=1;i<=n;i++)
    #define Fork(i,k,n) for(int i=k;i<=n;i++)
    #define Rep(i,n) for(int i=0;i<n;i++)
    #define ForD(i,n) for(int i=n;i;i--)
    #define RepD(i,n) for(int i=n;i>=0;i--)
    #define Forp(x) for(int p=pre[x];p;p=next[p])
    #define Lson (x<<1)
    #define Rson ((x<<1)+1)
    #define MEM(a) memset(a,0,sizeof(a));
    #define MEMI(a) memset(a,127,sizeof(a));
    #define MEMi(a) memset(a,128,sizeof(a));
    #define INF (2139062143)
    #define F (10007)
    long long mul(long long a,long long b){return (a*b)%F;}
    long long add(long long a,long long b){return (a+b)%F;}
    long long sub(long long a,long long b){return (a-b+(a-b)/F*F+F)%F;}
    long long n;
    int main()
    {
    	freopen("repay.in","r",stdin);
    	freopen("repay.out","w",stdout);
    	cin>>n;
    	long long ans=2;
    	For(i,n)
    	{
    		if (ans==0) break;
    		ans=mul(ans,i);ans=mul(ans,i);
    	}
    	cout<<ans<<endl;
    
    	return 0;
    }

    文章结束给大家分享下程序员的一些笑话语录: 面试官:熟悉哪种语言
    应聘者:JAVA
    面试官:知道什么叫类么
    应聘者:我这人实在,工作努力,不知道什么叫累
    面试官:知道什么是包?
    应聘者:我这人实在 平常不带包 也不用公司准备了
    面试官:知道什么是接口吗?
    应聘者:我这个人工作认真。从来不找借口偷懒
    面试官:知道什么是继承么
    应聘者:我是孤儿没什么可以继承的
    面试官:知道什么叫对象么?
    应聘者:知道,不过我工作努力,上进心强,暂时还没有打算找对象。
    面试官:知道多态么?
    应聘者:知道,我很保守的。我认为让心爱的女人为了自已一时的快乐去堕胎是不道德的行为!请问这和C#有什么关系??

    --------------------------------- 原创文章 By
    整数和矩阵
    ---------------------------------

  • 相关阅读:
    如何看内存占用情况,vue反复操作tab标签页面内存一直在涨,系统反应越来越慢,内存快占用1个G
    正则表达式(二)- 位置匹配攻略
    正则表达式(一)- 字符匹配攻略
    判断是否闰年
    vue切换Tab标签滚到相应位置,鼠标滚轮滚动,tab标签自动切换到相应位置
    el-cascader获取lable的值
    金额最多只能输入两位小数
    npm镜像源管理工具
    pinyin-match与pinyin-engine的区别
    el-select优化TSelect,下拉框只能选末级,启用状态
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3150277.html
Copyright © 2011-2022 走看看