zoukankan      html  css  js  c++  java
  • 小明系列故事——未知剩余系(反素数,好)

    小明系列故事——未知剩余系

    Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1281    Accepted Submission(s): 319

    Problem Description
      “今有物不知其数,三三数之有二,五五数之有三,七七数之有二,问物几何?”
      这个简单的谜题就是中国剩余定理的来历。
      在艰难地弄懂了这个定理之后,小明开始设计一些复杂的同余方程组X mod ai = bi 来调戏别人,结果是必然的,都失败了。
      可是在这个过程中,小明发现有时并不一定要把ai和bi告诉你。他只需要告诉你,ai在区间 [1, X] 范围内每个值取一次时,有K个ai使bi等于0,或有K个ai使bi不等于0,最小的X就可以求出来了。
      你来试试看吧!
     
    Input
    输入第一行为T,表示有T组测试数据。 每组数据包含两个整数Type和K,表示小明给出的条件。Type为0表示“有K个ai使bi等于0”,为1表示“有K个ai使bi不等于0”。
    [Technical Specification]
    1. 1 <= T <= 477 2. 1 <= K <= 47777, Type = 0 | 1
     
    Output
    对每组数据,先输出为第几组数据,如果没有这样的数,输出“Illegal”,否则输出满足条件的最小的X,如果答案大于2^62, 则输出“INF”。
     
    Sample Input
    3 0 3 1 3 0 10
     
    Sample Output
    Case 1: 4 Case 2: 5 Case 3: 48
     
    Source
     

    题解:当type是0的时候是反素数模版,不过要剪枝,否则超时;当type是1

    的时候是因子个数是x-k个;用俩重循环;

    代码:

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    #include<cmath>
    #include<vector>
    #include<algorithm>
    using namespace std;
    const double PI=acos(-1.0);
    #define SI(x) scanf("%d",&x)
    #define SL(x) scanf("%lld",&x)
    #define PI(x) printf("%d",x)
    #define PL(x) printf("%lld",x)
    #define T_T while(T--)
    #define P_ printf(" ")
    int prim[16]={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53};
    typedef unsigned long long uLL;
    const int MAXN=60010;
    const uLL INF=(uLL)~0;
    uLL ans;
    int k;
    int dp[MAXN];
    void initial(){
    	for(int i=0;i<MAXN;i++)dp[i]=i;
    	for(int i=1;i<MAXN;i++){
    		for(int j=i;j<MAXN;j+=i)dp[j]--;
    		if(dp[dp[i]]==0)//如果没被使用就让dp[dp[i]]=i; **
    		dp[dp[i]]=i;
    		dp[i]=0;//当前值已经没用了,就为0 **
    	}
    }
    void dfs(int pos,uLL v,int num){
    	if(num==k&&ans>v)ans=v;
    	for(int i=1;i<=62;i++){
    		if(num*(i+1)>k||ans/prim[pos]<v)break;//剪枝; 
    		v*=prim[pos];
    		if(k%(num*(i+1))==0)dfs(pos+1,v,num*(i+1));//剪枝 
    	}
    }
    int main(){
    	int T,kase=0;
    	SI(T);
    	initial();
    	T_T{
    		int type;
    		SI(type);SI(k);
    		ans=INF;
    		if(type)ans=dp[k];
    		else{
    			dfs(0,1,1);
    		}
    		printf("Case %d: ",++kase);
    		if(ans==0)puts("Illegal");
    		else if(ans==INF)puts("INF");
    		else printf("%llu
    ",ans);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    JS高程研读记录一【事件流】
    事件冒泡的应用——jq on的实现
    模式学习小结[工厂模式|构造函数|原型模式]
    几个CSS-content的小例子
    构造函数new执行与直接执行的区别
    gulp布局构建小结
    理解上下文与作用域
    定义变量的注意问题
    JUC的世界III
    JUC的世界II
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5017882.html
Copyright © 2011-2022 走看看