According to the following page, a primary key is used for both LIKE and NOT LIKE conditions:
https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/#functions-support

As I found, a primary key is not used for NOT LIKE 'prefix%' conditions, engine scans all granules.

**How to reproduce**
ClickHouse Playground:
https://fiddle.clickhouse.com/095384c8-7b7e-45ec-b7e7-42dc8150be89

```
CREATE TABLE data
(str String)
ENGINE=MergeTree
ORDER BY str;

INSERT INTO data (str)
SELECT 'aa' FROM numbers(100000);

INSERT INTO data (str)
SELECT 'ba' FROM numbers(100000);

INSERT INTO data (str)
SELECT 'ca' FROM numbers(100000);

SET send_logs_level='trace';

SELECT count()
FROM data
WHERE str NOT LIKE 'a%';
```

`(SelectExecutor): Selected 3/3 parts by partition key, 3 parts by primary key, 36/36 marks by primary key, 36 marks to read from 3 ranges`

**Additional context**
Primary key is used for LIKE conditions, engine skips granules:
https://fiddle.clickhouse.com/95dd14a6-2e9f-4c45-94cd-169233f2a702

Primary key is used for != conditions, engine skips granules:
https://fiddle.clickhouse.com/e208b937-20c3-4cc0-896b-bfe83b42454a

DataTypePtr & out_key_column_type,
    Field & out_value,
    DataTypePtr & out_type,
    std::function<bool(IFunctionBase &, const IDataType &)> always_monotonic) const
{
    const auto & sample_block = key_expr->getSampleBlock();
    for (const auto & node : key_expr->getNodes())
    {
        auto it = key_columns.find(node.result_name);
        if (it != key_columns.end())
        {
            std::stack<const ActionsDAG::Node *> chain;
            const auto * cur_node = &node;
            bool is_valid_chain = true;
            while (is_valid_chain)
            {
                if (cur_node->result_name == expr_name)
                    break;
                chain.push(cur_node);
                if (cur_node->type == ActionsDAG::ActionType::FUNCTION && cur_node->children.size() <= 2)
                {
                    is_valid_chain = always_monotonic(*cur_node->function_base, *cur_node->result_type);
                    const ActionsDAG::Node * next_node = nullptr;
                    for (const auto * arg : cur_node->children)
                    {
                        if (arg->column && isColumnConst(*arg->column))
                            continue;
                        if (next_node)
                            is_valid_chain = false;
                        next_node = arg;