Trailing Zeroes (I) LightOJ - 1028 (素数筛+唯一分解定理)

本文介绍了一种使用素数筛求解特定数学问题的方法。该问题要求计算一个数n的所有因子个数,尤其关注那些能整除n的因子。通过实现高效的素数筛算法并结合唯一分解定理,文章提供了一个名为Eulor的函数,用于快速计算出结果。

题目:Trailing Zeroes (I) LightOJ - 1028 

题意:概括题意给你一个数字n,就是问你有多个可以被n整除的。

思想:看到题意我们很容易想到唯一分解定理,n = (p1^e1)*(p2^e2)*(p3^e3).....,那么我们根据唯一分解定理求出n的因子的个数,但是如果你直接求的话,时间会超时,所以需要素数筛,把素数筛出来。

代码:

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn = 1e6;
int pri[maxn], vis[maxn];
int cn;
void Prime(){
     for(int i = 2; i <= maxn; i++){
        if(!vis[i])pri[cn++] = i;
        for(int j = 1; j < cn && i*pri[j]<maxn; j++){
            vis[pri[j]*i] = 1;
            if(i % pri[j] == 0)break;
        }
     }
}
LL Eulor(LL x){
     LL ans = 1, cnt = 0;
     for(int i = 1; pri[i]*pri[i] <= x && i < cn; i++){
         if(x % pri[i] == 0){
            int cnt = 0;
            while(x % pri[i] == 0){
                x /= pri[i];
                cnt++;
            }
            ans *= (cnt+1);
         }

     }
     if(x > 1)ans *= 2;
     return ans-1;
}
int main(){
    int T;
    cn = 1;
    Prime();
    //for(int i = 1; i <=100; i++)cout<<pri[i]<<" ";
    cin>>T;
    int cnt = 0;
    while(T--){
        LL n;
        cin>>n;
        printf("Case %d: %lld\n", ++cnt, Eulor(n));
    }
return 0;
}

 

你当前的 SQL 查询使用了 `REGEXP_LIKE` 来匹配 `a.BINCODE` 和 `c.BINCODE`,但 **没有查到 BINX 的数据**,即使 `Q59401-04` 对应的 `a.BINCODE = 'BIN1|BIN9|BINB;'`,而 `c.BINCODE = 'BINX'` 存在。 --- ## 🔍 问题分析 你当前查询的逻辑是: ```sql REGEXP_LIKE( TRIM(TRAILING ';' FROM a.bincode), '(^|\|)' || TRIM(c.bincode) || '(\||$)') ``` 这个正则表达式的意思是:**在 a.BINCODE 中查找完全匹配 c.BINCODE 的项**,确保它前后是 `|` 或字符串边界。 ### 你提供的示例: - `a.BINCODE`: `BIN1|BIN9|BINB;`(去除分号后变成 `BIN1|BIN9|BINB`) - `c.BINCODE`: `BINX` 此时,`BINX` 并不在 `a.BINCODE` 的列表中,所以 **不匹配是正常的**。 --- ## ✅ 如果你希望匹配所有 `c.BINCODE`(包括 BINX),即使不在 a.BINCODE 列表中,可以使用 **RIGHT JOIN** 或 **将主表改为 TB_SJ_WAFER_DIE_BIN_INFO c**。 ### ✅ 修改后的 SQL 示例: ```sql SELECT a.WAFERTYPE, a.PRODUCTID, a.WAFERLOT, a.WAFERNO, a.WAFERDIEQTY, c.BINCODE, c.QTY FROM TB_SJ_WAFER_DIE_BIN_INFO c LEFT JOIN TB_SJ_WAFER_DIE_INFO b ON c.WAFERID = b.WAFERID LEFT JOIN TB_AB2_WO_INFO_PN2M a ON a.WAFERID = b.WAFERID AND REGEXP_LIKE(TRIM(TRAILING ';' FROM a.BINCODE), '(^|\|)' || TRIM(c.BINCODE) || '(\||$)') WHERE b.FABSITE = 'SJ_AB2' AND b.DELETED = 0 AND c.DELETED = 0 AND c.WAFERID = 'Q59401-04' ORDER BY a.WAFERTYPE; ``` ### ✅ 修改说明: - **将主表改为 `TB_SJ_WAFER_DIE_BIN_INFO c`**,确保 `BINX` 不会被过滤掉。 - `LEFT JOIN` TB_AB2_WO_INFO_PN2M a,并将 `REGEXP_LIKE` 放在 `ON` 条件中。 - 使用 `c.WAFERID = 'Q59401-04'` 过滤具体 wafer。 - 这样可以查到所有 `c.BINCODE`(包括 BINX),即使它不在 `a.BINCODE` 列表中。 --- ## ✅ 如果你想查出所有 BINCODE(包括 BINX),并显示是否有匹配的 a.BINCODE: ```sql SELECT a.WAFERTYPE, a.PRODUCTID, a.WAFERLOT, a.WAFERNO, a.WAFERDIEQTY, c.BINCODE, c.QTY, CASE WHEN REGEXP_LIKE(TRIM(TRAILING ';' FROM a.BINCODE), '(^|\|)' || TRIM(c.BINCODE) || '(\||$)') THEN '匹配' ELSE '不匹配' END AS MATCH_STATUS FROM TB_SJ_WAFER_DIE_BIN_INFO c LEFT JOIN TB_SJ_WAFER_DIE_INFO b ON c.WAFERID = b.WAFERID LEFT JOIN TB_AB2_WO_INFO_PN2M a ON a.WAFERID = b.WAFERID WHERE b.FABSITE = 'SJ_AB2' AND b.DELETED = 0 AND c.DELETED = 0 AND c.WAFERID = 'Q59401-04'; ``` --- ## ✅ 总结 | 场景 | 推荐使用 | |------|----------| | 只查匹配的 BINCODE | LEFT JOIN TB_AB2_WO_INFO_PN2M a 为主表 | | 查所有 BINCODE(包括未匹配的) | RIGHT JOIN 或以 `TB_SJ_WAFER_DIE_BIN_INFO c` 为主表 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值